;---------------------------------------------------------------------------- ; MODULE NAME: FTPLIKEI.IH ; ; $Author: Dennis_Bareis $ ; $Revision: 1.1 $ ; $Date: 19 Feb 2000 15:05:50 $ ; $Logfile: E:/DB/PVCS.IT/OS2/PPWIZARD/FTPLIKEI.IHV $ ; ; DESCRIPTION: DO NOT INCLUDE THIS FILE YOURSELF!!!! USE FTPLIKE.IH! ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; Further comments at the end of this file! ; ;---------------------------------------------------------------------------- ;--- First time through? ---------------------------------------------------- #ifndef _FTPLIKE_INITIALIZED ;--- Try to ensure that header called correctly! ------------------------- #ifndef FTPLIKE_CALLED_CORRECTLY #error ^Please include "FTPLIKE.IH" not "FTPLIKEI.IH"!^ #endif ;--- Define the version number of this header file ----------------------- #define+ VERSION_FTPLIKE_IH 00.045 #require 00.030 ;--- Check prerequisites ------------------------------------------------- #ifndef FTPLIKE_DIRECTORY #error ^You must define the "FTPLIKE_DIRECTORY" value (local directory)!^ #endif #ifndef FTPLIKE_DIRECTORY_WEB #error ^You must define the "FTPLIKE_DIRECTORY_WEB" value (web location)!^ #endif ;--- Include macro push/pop support -------------------------------------- #ifndef VERSION_PUSHPOPM_H #include "PushPopM.H" #endif ;--- Include Better Sort Header ------------------------------------------ #ifndef VERSION_PPWSORT_H #include "PPWSORT.H" #endif ;--- Use same date time on all generated pages --------------------------- #ifndef FTPLIKE_DATETIME #evaluate FTPLIKE_DATETIME @date('WeekDay') || ' ' || date('Month') || ' ' || substr(date('Sorted'), 7, 2) || ' ' || left(date('Sorted'), 4) || ' at ' || time('Civil')@ #endif ;--- Total numbers accross FTP pages ------------------------------------- #RexxVar FtpTotalDirCnt = 0 ;;Number of directories #RexxVar FtpTotalFileCnt = 0 ;;Number of files ;--- Remember the output level where it all began! ----------------------- #Rexxvar FtpStartLevel = ;--- We start processing "non virtual" directories ----------------------- #RexxVar RealDirTree = 'Y' ;--- Work out what filemasks users wants --------------------------------- #ifndef FTPLIKE_FILE_MASKS ;--- Default is to process all files ----------------------------- #if ['' = 'UNIX'] #define FTPLIKE_FILE_MASKS #else #define FTPLIKE_FILE_MASKS *.* #endif #endif #ifndef FTPLIKE_DIR_MASKS ;--- Default is to process all directories ----------------------- #if ['' = 'UNIX'] #define FTPLIKE_DIR_MASKS #else #define FTPLIKE_DIR_MASKS *.* #endif #endif ;--- Do best we can for input dependancies ------------------------------- #ifdef FTPLIKE_FOLLOW_SUBDIRECTORIES #DependsOn INPUT ^*FILES=+<$FTPLIKE_DIRECTORY><$FTPLIKE_DIR_MASKS>^ #elseif #DependsOn INPUT ^*FILES=<$FTPLIKE_DIRECTORY><$FTPLIKE_DIR_MASKS>^ #endif ;--- Allow user to easily support frames etc ----------------------------- #ifndef FTPLIKE_LINK2DIR #define FTPLIKE_LINK2DIR #endif #ifndef FTPLIKE_LINK2FILE #define FTPLIKE_LINK2FILE ;;Probably would not want to override this #endif ;--- Prepare for generating HTML page names ------------------------------ #ifdef FTPLIKE_FOLLOW_SUBDIRECTORIES ;--- Prepare for generating html page names (unique names!) ------ #evaluate '' ^call GetIdPrepare 'FTPLIKE', 'Y'^ ;--- Don't generate filename same as current "base" file! -------- #evaluate '' ^call SetId 'FTPLIKE', '', EnsureFileHasCorrectCase(_filespec('W', _filespec('Name', '')))^ #endif ;--- Now work out the output directory ----------------------------------- #evaluate+ 'FtpGenDir' ^_filespec('location', '')^ ;--- Work out the full name of this header file -------------------------- #RexxVar FtpLikeFile = '' ;--- Work out what user wants to call the "root" dir --------------------- #ifndef FTPLIKE_DISPLAY_DIR #define FTPLIKE_DISPLAY_DIR / #endif ;--- Work out extension to use ------------------------------------------- #ifndef FTPLIKE_HTML_EXTN #define FTPLIKE_HTML_EXTN htm #endif ;--- Define command file extension --------------------------------------- #ifndef FTPLIKE_CMD_FILE_DIR #define FTPLIKE_CMD_FILE_DIR dirattr.$$$ #endif ;--- User want specific prefix for generated filenames ------------------- #ifndef FTPLIKE_NEWHTML_PREFIX #ifdef FTPLIKE_USE_LONG_FILENAMES #define FTPLIKE_NEWHTML_PREFIX FtpLike_ #elseif #define FTPLIKE_NEWHTML_PREFIX ;;No prefix #endif #endif ;--- Define Simple HEADERS & FOOTERS ------------------------------------- #ifndef FTPLIKE_HEADER #define FTPLIKE_HEADER

{$Title}

#endif #ifndef FTPLIKE_FOOTER #define FTPLIKE_FOOTER \
%\
%\ %\ <$FTPLIKE_DATETIME> %\ %\
%\ #endif ;--- Define how we create local graphics files! -------------------------- #DefineRexx 'REXX_MAKE_LOCAL_GRAPHIC' ;--- Work out the graphic (put in same directory as HTML) ------------ LocalGifFile = EnsureFileHasCorrectCase(_filespec('location', '') || '{$ImgName}'); ;--- Create the file ------------------------------------------------- CloseRc = stream(LocalGifFile, 'c', 'close'); DelRc = _SysFileDelete(LocalGifFile); if stream(LocalGifFile, 'c', 'query exists') <> '' then Error('Could not delete "' || LocalGifFile || '" (is it in use?), DeleteRc=' || DelRc); WriteRc = charout(LocalGifFile, {$DataVar}); call DieIfIoErrorOccurred LocalGifFile; CloseRc = stream(LocalGifFile, 'c', 'close'); call AddOutputFileToDependancyList(LocalGifFile); #DefineRexx ;--- Define START OF HTML page ------------------------------------------- #ifndef FTPLIKE_HEAD_STYLE_TAGS #define FTPLIKE_HEAD_STYLE_TAGS #endif #ifndef FTPLIKE_EXTRA_HEAD_TAGS #define FTPLIKE_EXTRA_HEAD_TAGS #endif #ifndef FTPLIKE_BODY_LINK_COLOR #define FTPLIKE_BODY_LINK_COLOR ;;Just browser default #endif #ifndef FTPLIKE_BODY_ALINK_COLOR #define FTPLIKE_BODY_ALINK_COLOR ;;Just browser default #endif #ifndef FTPLIKE_BODY_VLINK_COLOR #define FTPLIKE_BODY_VLINK_COLOR ;;Just browser default #endif #ifndef FTPLIKE_BODY_ATTR_OTHER #define FTPLIKE_BODY_ATTR_OTHER ;;No other body attributes (by default) #endif #ifndef FTPLIKE_BODY_BG_IMG ;--- Set up the default graphics filename ---------------------------- #define FTPLIKE_BODY_BG_IMG ftp_wood.jpg ;--- Create the graphic file ------------------------------------- #DefineRexx '' ;--- Load the graphic data ----------------------------------- Gd = "" Gd = Gd || "FFD8FFE000104A46494600010101012C012C0000FFDB004300140E0F120F0D14121012171514181E32211E1C1C1E3D2C2E243249404C4B47404645505A736250"x Gd = Gd || "556D5645466488656D777B8182814E608D978C7D96737E817CFFDB0043011517171E1A1E3B21213B7C5346537C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C"x Gd = Gd || "7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7CFFC0001108007D008203012200021101031101FFC4001F0000010501010101010100"x Gd = Gd || "000000000000000102030405060708090A0BFFC400B5100002010303020403050504040000017D01020300041105122131410613516107227114328191A10823"x Gd = Gd || "42B1C11552D1F02433627282090A161718191A25262728292A3435363738393A434445464748494A535455565758595A636465666768696A737475767778797A"x Gd = Gd || "838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE1E2E3E4E5E6E7E8E9EAF1"x Gd = Gd || "F2F3F4F5F6F7F8F9FAFFC4001F0100030101010101010101010000000000000102030405060708090A0BFFC400B5110002010204040304070504040001027700"x Gd = Gd || "0102031104052131061241510761711322328108144291A1B1C109233352F0156272D10A162434E125F11718191A262728292A35363738393A43444546474849"x Gd = Gd || "4A535455565758595A636465666768696A737475767778797A82838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4"x Gd = Gd || "C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE2E3E4E5E6E7E8E9EAF2F3F4F5F6F7F8F9FAFFDA000C03010002110311003F00EA8F4C7F5EB480FEA7EB4B9EC3A7F3A68F"x Gd = Gd || "7F5AE0351CDC727B52F3EF487EEF5C669060FB669801F638A43EDC7D29DCF6CF1FAD338E9FE714810BF4FE5463818A5C7AD07FCE680100E7BE6971C50073C504"x Gd = Gd || "F5FCF14007E148DD3EB476CFA518E4FAD31863F1FC697B67AD07B633F5EB40E3F950210FA75A3B6073487D0F6A76290C701900EE34B8FF0068D33E5EE133EF8A"x Gd = Gd || "3E5F48FF004A0403AE33EC7DE91863AD3BA50DC138ED400646382452745C1E3DA9474A3D47AF230698010327EB4831F97A53BAE7B9A4F50734009D08F6F4340E"x Gd = Gd || "C38FF3FE7FCE2827BFE3474C8A4020E7FF00D7413F5A0E718A39FCE8181E31D6957A0E79FEB4DFBC78FC7E94FEB9CD00267B83450738EFF8D1F4CFF85310DEA4"x Gd = Gd || "7A7FFAA9FD8E7EB4D1CF27DC9A7679F7A40C307FCB1A307FCB1A0EDCF3B3F1349F2FFD33FCE90C53C1EB430E08EBC51D7A0CD29E991F81A6489D4648E3DFB50F"x Gd = Gd || "91CF51DF8A0633C7AD29C103A7F8D3010E3F3EBCFE947BF1F87142E718EFD2823BFAF7A0043D7918F5E293B1ED4BDE8EDD3AFEB4860172471F95230F6A51CE3B"x Gd = Gd || "D008C924738A004C055009007E59A77A1073E8453422F5DA334E38C7414C06FE1DBFCFF9F7A4EA694F0A739F53DA954638E4FAFBD2180181F4A39CE3D297E872"x Gd = Gd || "7B51D0E71C0E9DA98878E9C1A5A41D052D22461191D73F5A39F7A3B6463F3A147FF5B0298C6F43D3BFBD3CE3B914C2006FCB38A78C91CF51C74A0191FDD39EDD"x Gd = Gd || "3AF4A7679E4FE348DF4F5F6A4C1C7078F7A07B8E3FCFD6A3273D2948C9E703D69DDF8C7A74A43D86FCDD31EBFE45380C703F0A003B7DC7B52F7A04C17A0EF41E"x Gd = Gd || "9D7DFF00CFF9ED40FD683EC4714C4358608ED4F1DBFC79A8C0CB0C71E840A793C11F9E290D81FF0023AE682319F5EBE941CE79E3FCFF009FCA83E94C0367B2FE"x Gd = Gd || "546CF65FFBE694370393F91A5DDEE7F2353A86A275C0FC8D03AFBD03393CFE9411F974E954211B239EF4AA4607B7F2A186571F5A4539C13400118FE5D2900C73"x Gd = Gd || "8C1F5C53B041CD2631EDF87F4A003A11F5FCE9A79CE7AE314FE9DA8208CF2690C68C60FA03F952FD051DCFB52FB77F4A60341E7F1F5A33C5073CFF005A46CF41"x Gd = Gd || "F9FA5200519FC79A5CFF0017E39A518CF5F7CD37AB0F5C5002AF5E47B6334BDF3E9EF4743D4F1EB40EDC7E06800D9ECBF88A367B2FE54F1D075A5FC695857630"x Gd = Gd || "003AF4E94374F7A0F078CFE1C9FF003D68E0FA63DAA8051C83C77E94DC9F5FC69C324679C1A69E09A005C0E38181CF1474F63475A07BFB50007D874A3DF1F4CD"x Gd = Gd || "1D31914631F5FA50027AF1D3D697BD3475FE5467A1A0620C64E3F0F5A1467E9D0507201FD29CBD7DF1F4CD200246723BFEB40C807D282704907FFAF48A06D03B"x Gd = Gd || "FF002A6029EB81D7A7AFF9FF00F5D28E87D29BF5FF003EB4BCE3DFA5020CBF6E9DBFCE68CBFA7F9FCEA418C0EB47E7482E46C78FC7D69C3B8F7F5A693D726947"x Gd = Gd || "D3F034C017AFE3C50C7A11FCE819CF1CD0F90339C1F5A00076E3DA93A67B63F4A383DBAFE3FE7AD1E94006724F4E7D6941E9D79FD69BD31EA28EE7BE281D83FC"x Gd = Gd || "2918F3C9E68E849CFBE69ADB8F4E948685CF3D07FF005AA45E9C77A880F9BF0A90741C1E298981E7F13CD0D9200F5A69EA31D852FF001631FF00D7A0050781F4"x Gd = Gd || "A3F8BA7E14038EFF00FD7A17393400F1D38E94BCD203C0E697F1A4491FAFD7F2A518C7F8534F6F7FF1A72F3CFBFF005A362843C1CF7EF4ADCAF18FAD27F101EF"x Gd = Gd || "8FD2947271DF9E6988693EBE9EB413DCF7F6EB4A07031DCE29806E3C719FF3FD690C70A43D474FA9A53D33C7209A461EE7B918FAD031A0F3C1E0528E9F8D07E5"x Gd = Gd || "623D3FFD74F29819A0189DF9EB4BED8CF3DE82B861838EDC0A43C283DBD3F0CD31013D49FF0023349D339C7B8A31918F4FF1C500FC99F63400EEC7FC2917BFD7"x Gd = Gd || "B76A1B8C8C0E067FCFE748BE9EFF00E3FE1400EE7FBADF9FFF005E8E7FBADF9FFF005E955015079E47AD2EC1EFF9D166173FFFD9"x <$REXX_MAKE_LOCAL_GRAPHIC DATAVAR="GD" IMGNAME='<$FTPLIKE_BODY_BG_IMG>'> #DefineRexx ;--- If user did not supply background color, use matching one --- #ifndef FTPLIKE_BODY_BG_COLOR #define FTPLIKE_BODY_BG_COLOR #FFFFC6 #endif #endif #ifndef FTPLIKE_BODY_BG_COLOR #define FTPLIKE_BODY_BG_COLOR ;;Browser default background color #endif #ifndef FTPLIKE_BODY_TAG ;--- Combine components to give overall body tag ----------------- #define FTPLIKE_BODY_TAG \ " <> ''] -\ BACKGROUND="<$FTPLIKE_BODY_BG_IMG>" -\ #endif -\ #if ["<$FTPLIKE_BODY_BG_COLOR>" <> ''] -\ BGCOLOR="<$FTPLIKE_BODY_BG_COLOR>" -\ #endif -\ #if ["<$FTPLIKE_BODY_LINK_COLOR>" <> ''] -\ LINK="<$FTPLIKE_BODY_LINK_COLOR>" -\ #endif -\ #if ["<$FTPLIKE_BODY_ALINK_COLOR>" <> ''] -\ ALINK="<$FTPLIKE_BODY_ALINK_COLOR>" -\ #endif -\ #if ["<$FTPLIKE_BODY_VLINK_COLOR>" <> ''] -\ VLINK="<$FTPLIKE_BODY_VLINK_COLOR>" -\ #endif -\ <$FTPLIKE_BODY_ATTR_OTHER $$SPCPLUS> -\ > #endif #ifndef FTPLIKE_START_HTML_PAGE #define FTPLIKE_START_HTML_PAGE \ %\ %\ %\ %\ <$FTPLIKE_DISPLAY_DIR> %\ <$FTPLIKE_EXTRA_HEAD_TAGS> -\ <$FTPLIKE_HEAD_STYLE_TAGS> -\ %\ <$FTPLIKE_BODY_TAG> %\ <$FTPLIKE_HEADER Title=^<$FTPLIKE_DISPLAY_DIR>^> %\ #endif ;--- Define some stubs (you can add comments like "no directories found" etc) --- #ifndef FTPLIKE_START_PAGE_AFTER_TITLE #define FTPLIKE_START_PAGE_AFTER_TITLE \ <$FTPLIKE_HANDLE_DIRKEY_DIRTEXT> #endif #ifndef FTPLIKE_BETWEEN_DIRS_AND_FILES #define FTPLIKE_BETWEEN_DIRS_AND_FILES #endif #ifndef FTPLIKE_END_PAGE_ABOVE_FOOTER #define FTPLIKE_END_PAGE_ABOVE_FOOTER #endif ;--- Define START OF files ----------------------------------------------- #ifndef FTPLIKE_BEFORE_ALL_FILES #define FTPLIKE_BEFORE_ALL_FILES \
%\ #endif #ifndef FTPLIKE_BEFORE_ALL_DIRS #define FTPLIKE_BEFORE_ALL_DIRS \
%\
#endif ;--- Parent directory handling ------------------------------------------- #ifndef FTPLIKE_GENERATE_DOT_DOT ;** CommentBlock /* (Saturday 05/02/2000, 18:17:34, by Dennis_Bareis) */ ;**+-------------------------------------------------------------------------- ;**| #define FTPLIKE_GENERATE_DOT_DOT \ ;**| ;**+-------------------------------------------------------------------------- ;** /* (Saturday 05/02/2000, 18:17:34, by Dennis_Bareis) */ #define FTPLIKE_GENERATE_DOT_DOT \ -\ -\ -\ -\ #endif ;--- How to convert shoty part of "FtpFile" to a "descriptive" version --- #ifndef FTPLIKE_GET_SHORT_DESC #if ['' = 'OS/2'] ;--- This is OS/2 (may have better "name") ----------------------- #evaluate "" "call RxFuncAdd 'SysGetEA', 'RexxUtil', 'SysGetEA'" #DefineRexx 'FTPLIKE_GET_SHORT_DESC' ;--- Long name is stored in OS/2 Extended Attributes ------------ FtpShortD = ''; if SysGetEA(FtpFile, ".LONGNAME", "FtpShortD") <> 0 then FtpShortD = ''; else FtpShortD = substr(FtpShortD, 5); ;;Drop EA Type info if FtpShortD = '' then ;;Play safe! FtpShortD = FtpShortR; ;;Use what we have! else FtpShortD = ReplaceString(FtpShortD, '0D0A'x, '
'); #DefineRexx #else ;--- Not OS/2 (can't do anything) ------------------------------------ #define FTPLIKE_GET_SHORT_DESC FtpShortD = FtpShortR #endif #endif ;--- Determine how we create a valid rexx variable name from a "key" ----- #DefineRexx 'C2X' #ifndef FTPLIKE_DONT_USE_C2X ;--- Use c2x() (doubles key size, max variable length=250 under OS/2's rexx) --- {$ResultVar} = c2x({$KeyVar}); #elseif ;--- Use a slower routine that doesn't expand as much! ----------- ValidRexxChars = xrange('A', 'Z') || xrange('a', 'z') || xrange('0', '9') || '!_'; ;;Don't include '?' as used for code below! Stuff = {$KeyVar}; InvPos = verify(Stuff, ValidRexxChars); do while InvPos <> 0 ;--- We have found an invalid character ---------------------- Stuff = left(Stuff, InvPos-1) || '?' || c2x(substr(Stuff, InvPos, 1)) || substr(Stuff, InvPos+1); ;--- Look for next invalid character ------------------------- InvPos = verify(Stuff, ValidRexxChars,, InvPos+3); end; ;--- Set result -------------------------------------------------- {$ResultVar} = Stuff; #endif #DefineRexx ;--- Gain access to "special" directory informtion ----------------------- #DefineRexx FTPLIKE_POINT2_EXTRA_DIR_INFO ;--- Get access to any info for this directory --------------- #if ['' = 'UNIX'] FtpDirCode = {$DIRECTORY}; ;;Unix is case sensitive #else FtpDirCode = translate({$DIRECTORY}); ;;Make upper case #endif FtpDirCode = FtpDirCode || ''; ;;Need code to have ending '\'; <$c2x ResultVar="KeyCode" KeyVar="FtpDirCode"> FtpKey = 'FtpDir2Slot.!' || KeyCode; if RexxVarDefined(FtpKey) then DirStore = _valueG(FtpKey); else DirStore = ''; #DefineRexx ;--- Point to the base directories Info ---------------------------------- #evaluate ^^ ~<$FTPLIKE_POINT2_EXTRA_DIR_INFO DIRECTORY=^'<$FTPLIKE_DIRECTORY $$SQx2>'^>~ ;--- How to handle a directory's name ------------------------------------ #ifndef FTPLIKE_GENERATE_HTML_FOR_DIR_TREE #DefineRexx FTPLIKE_GET_DIR_HTMLNAME ;;User can "name" a directory's html ;--- Get access to any info for this directory --------------- <$FTPLIKE_POINT2_EXTRA_DIR_INFO DIRECTORY="FtpDir"> ;--- Now see if alias specified for this directory ----------- FtpKey = DirStore || 'ALIAS'; if RexxVarDefined(FtpKey) & RealDirTree = 'Y' then FtpDirId = '<$FTPLIKE_NEWHTML_PREFIX>' || _valueG(FtpKey); ;;Alias is basis for filename else do ;--- No alias. Just base on directory name --------------- #ifndef FTPLIKE_USE_LONG_FILENAMES FtpDirId = GetId('FTPLIKE', 'MAXCHARS', '<$FTPLIKE_NEWHTML_PREFIX>' || FtpShortD); #elseif #if ['<$FTPLIKE_USE_LONG_FILENAMES>' = ''] FtpDirId = GetId('FTPLIKE', '2_', '<$FTPLIKE_NEWHTML_PREFIX><$FTPLIKE_DISPLAY_DIR $$SQx2>/' || FtpShortD); #elseif FtpDirId = GetId('FTPLIKE', 'MAXCHARS', '<$FTPLIKE_NEWHTML_PREFIX><$FTPLIKE_DISPLAY_DIR $$SQx2>/' || FtpShortD,, '<$FTPLIKE_USE_LONG_FILENAMES>'); #endif #endif end; ;--- Make sure case is OK ------------------------------------ FtpDirId = EnsureFileHasCorrectCase(FtpDirId); ;--- Need as ppwizard variable ------------------------------- call MacroSet "FtpDirId", FtpDirId, 'Y'; #DefineRexx #DefineRexx FTPLIKE_UPDATE_DEFAULT_DIR_INFO ;;Default info saved, can now modify for this dir tree! ;--- User supply any directory info? ------------------------- if DirStore <> '' then do ;--- User supply background for this directory TREE? ----- FtpKey = DirStore || 'BGIMAGE'; if RexxVarDefined(FtpKey) then call MacroSet "FTPLIKE_BODY_BG_IMG", _valueG(FtpKey), 'Y'; FtpKey = DirStore || 'BGCOLOR'; if RexxVarDefined(FtpKey) then call MacroSet "FTPLIKE_BODY_BG_COLOR", _valueG(FtpKey), 'Y'; ;--- New mini icon for folder/directory display ---------- FtpKey = DirStore || 'DIRICON'; if RexxVarDefined(FtpKey) then call MacroSet "FTPLIKE_MINI_DIR_IMG_TAG", _valueG(FtpKey), 'Y'; ;--- User supply other BODY tag info? -------------------- FtpKey = DirStore || 'LINKCOLOR'; if RexxVarDefined(FtpKey) then call MacroSet "FTPLIKE_BODY_LINK_COLOR", _valueG(FtpKey), 'Y'; FtpKey = DirStore || 'ALINKCOLOR'; if RexxVarDefined(FtpKey) then call MacroSet "FTPLIKE_BODY_ALINK_COLOR", _valueG(FtpKey), 'Y'; FtpKey = DirStore || 'VLINKCOLOR'; if RexxVarDefined(FtpKey) then call MacroSet "FTPLIKE_BODY_VLINK_COLOR", _valueG(FtpKey), 'Y'; FtpKey = DirStore || 'BODYOTHER'; if RexxVarDefined(FtpKey) then call MacroSet "FTPLIKE_BODY_ATTR_OTHER", _valueG(FtpKey), 'Y'; end; #DefineRexx #define FTPLIKE_GENERATE_HTML_FOR_DIR_TREE \ ;--- Want to know what parent is -------- -\ #if = FtpStartLevel -\ #define+ ParentHtml "" ;;None! -\ #endif -\ <$MacroPush Macro='ParentHtml'> ;;Save Parent -\ #evaluate+ ^ParentHtml^ ^ToLowerCase(_filespec('name', ''))^ -\ -\ ;--- Start HTML page for new dir --- -\ #output "<$FtpDirId>.<$FTPLIKE_HTML_EXTN>" -\ ;--- "PUSH" some values --- -\ <$MacroPush Macro='InDirTable'> -\ <$MacroPush Macro='FTPLIKE_DIRECTORY'> -\ <$MacroPush Macro='FTPLIKE_DIRECTORY_WEB'> -\ <$MacroPush Macro='FTPLIKE_DISPLAY_DIR'> -\ <$MacroPush Macro='FtpDirId'> -\ #RexxVar PUSH FtpShortR FtpShortD FtpDir -\ -\ ;--- Create HTML contents --- -\ #option PUSH DefineMacroReplace=ON -\ #define+ FTPLIKE_DIRECTORY -\ #evaluate+ FTPLIKE_DISPLAY_DIR ^ReplaceString('<$FTPLIKE_DISPLAY_DIR $$SQx2>/' || FtpShortD, '//', '/')^ -\ #define+ FTPLIKE_DIRECTORY_WEB <$FTPLIKE_DIRECTORY_WEB>/ -\ #option POP -\ #include "FTPLIKE.ih" -\ -\ ;--- "POP" some values --- -\ #RexxVar POP FtpShortR FtpShortD FtpDir -\ <$MacroPop Macro='FtpDirId'> -\ <$MacroPop Macro='FTPLIKE_DISPLAY_DIR'> -\ <$MacroPop Macro='FTPLIKE_DIRECTORY_WEB'> -\ <$MacroPop Macro='FTPLIKE_DIRECTORY'> -\ <$MacroPop Macro='InDirTable'> -\ #output -\ <$MacroPop Macro='ParentHtml'> ;;Restore Parent #endif ;--- Code related to mini icon in front of folders ----------------------- #ifndef FTPLIKE_MINI_DIR_IMG_TAG ;--- Need to define the HTML IMG TAG --------------------------------- #define FTPLIKE_MINI_DIR_IMG_TAG * ;--- Now create the Graphic (needed for the above html) -------------- #DefineRexx '' ;--- Load the graphic data ----------------------------------- Gd = "4749463839610E000B00810000FFFFFF000000C0C0C0FFFF0021F90401000000002C000000000E000B000002"x Gd = Gd || "23048268BB31F0466026D93B1DDC71AB0E4248187EDC2969A437AD1122C4F21C67185600003B"x <$REXX_MAKE_LOCAL_GRAPHIC DATAVAR="GD" IMGNAME='mini_dir.gif'> #DefineRexx #endif #ifndef FTPLIKE_MINI_DOT_DOT_IMG_TAG #option PUSH DefineMacroReplace=ON #define FTPLIKE_MINI_DOT_DOT_IMG_TAG <$FTPLIKE_MINI_DIR_IMG_TAG> #option POP #endif #define FTPLIKE_MINI_DIR_LINK \ ;--- How to handle (display) directory details --------------------------- #ifndef FTPLIKE_TEXT_FILE #define FTPLIKE_TEXT_FILE file #endif #ifndef FTPLIKE_TEXT_FILES #define FTPLIKE_TEXT_FILES files #endif #ifndef FTPLIKE_TEXT_DIR #define FTPLIKE_TEXT_DIR dir #endif #ifndef FTPLIKE_TEXT_DIRS #define FTPLIKE_TEXT_DIRS dirs #endif #ifndef FTPLIKE_DIR_HANDLER #define FTPLIKE_DIR_HANDLER \ <$FTPLIKE_MINI_DIR_LINK> -\ -\ -\ #endif ;--- How to handle a file's name ----------------------------------------- #ifndef FTPLIKE_FILE_LEFT_SIDE_DISPLAY #define FTPLIKE_FILE_LEFT_SIDE_DISPLAY \ ;;Start New File row %\ ;;End cell #endif #ifndef FTPLIKE_FILE_HANDLER #define FTPLIKE_FILE_HANDLER \ #evaluate '' ^FtpShortR = _filespec('name', FtpFile); <$FTPLIKE_GET_SHORT_DESC>^ -\ #evaluate '' ^eURL = UrlEncode('<$FTPLIKE_DIRECTORY_WEB $$SQx2>/' || FtpShortR, 'TO%', ' ')^ -\ <$FTPLIKE_FILE_LEFT_SIDE_DISPLAY> #endif ;--- How to handle a file's details -------------------------------------- #ifndef FTPLIKE_SHOW_FILE_TIME #define FTPLIKE_SHOW_FILE_TIME \ \ :: #endif #ifndef FTPLIKE_ADD_FILE_SIZE_AFTER_TIME #define FTPLIKE_ADD_FILE_SIZE_AFTER_TIME , bytes #endif #ifndef FTPLIKE_FILE_DETAILS_HANDLER #define FTPLIKE_FILE_DETAILS_HANDLER \ #evaluate '' ^<$FTPLIKE_FILE_ATTRIBUTE_HANDLER_REXX>;<$FTPLIKE_GET_FILE_COMMENT>^ -\ ;;End cell %\ ;;End this File row #endif ;--- Define END OF files ------------------------------------------------- #ifndef FTPLIKE_AFTER_ALL_FILES #define FTPLIKE_AFTER_ALL_FILES
..
-\ -\ <$FTPLIKE_MINI_DOT_DOT_IMG_TAG> -\ -\ ..back to parent
-\ <$FTPLIKE_LINK2DIR Url="<$FtpDirId>.<$FTPLIKE_HTML_EXTN>"> -\ <$FTPLIKE_MINI_DIR_IMG_TAG> -\ -\
-\ ;--- Link to HTML "DIRECTORY" page we will create --- -\ <$FTPLIKE_LINK2DIR Url="<$FtpDirId>.<$FTPLIKE_HTML_EXTN>"> -\ ;;Just output short name -\ -\ -\ ;--- How summary of folder contents ----------------- -\ -\ #if [FtpSubdirTotalFileCnt = 1] ;;(s) -\ <$FTPLIKE_TEXT_FILE> -\ #elseif -\ <$FTPLIKE_TEXT_FILES> -\ #endif -\ #if FtpSubdirTotalDirCnt <> 0 -\ and -\ #if [FtpSubdirTotalDirCnt = 1] ;;(s) -\ <$FTPLIKE_TEXT_DIR> -\ #elseif -\ <$FTPLIKE_TEXT_DIRS> -\ #endif -\ #endif -\
;;Start filename cell %\ <$FTPLIKE_LINK2FILE Url=""> -\ ;;Normally shortname -\ %\ ;;Start file details cell %\ <$FTPLIKE_SHOW_FILE_TIME> -\ <$FTPLIKE_ADD_FILE_SIZE_AFTER_TIME> %\ <$FTPLIKE_ADD_FILE_COMMENT> -\
#endif #ifndef FTPLIKE_AFTER_ALL_DIRS #define FTPLIKE_AFTER_ALL_DIRS

#endif ;--- Define ATTRIBUTE Handler (date, time, size etc) --------------------- #ifndef FTPLIKE_FILE_ATTRIBUTE_HANDLER_REXX #define FTPLIKE_FILE_ATTRIBUTE_HANDLER_REXX \ FtpTimeStamp = GetFileTimeStamp(FtpFile); -\ FtpSize = stream(FtpFile, 'c', 'query size'); -\ FtpSize = AddCommasToDecimalNumber(FtpSize); -\ parse var FtpTimeStamp FtpYear +4 FtpMonth +2 FtpDay +2 FtpHour +2 FtpMinute +2 FtpSecond; -\ FtpMon = substr('JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC', ((FtpMonth-1)*4)+1, 3); #endif ;--- Process this directory? (no filter by default) ---------------------- #ifndef FTPLIKE_DO_THIS_DIR #define FTPLIKE_DO_THIS_DIR ;;Generate for all directories #endif ;--- Process this file? (by default no ".diz" files!) -------------------- #ifndef FTPLIKE_DO_THIS_FILE #DefineRexx FTPLIKE_DO_THIS_FILE_REXX ;--- Check Extension ------------------------------------- DotPos = lastpos('.', FtpFile); if DotPos <> 0 then do ;--- Have an extension, extract it --- FtpFileExtn = translate(substr(FtpFile, DotPos+1)); ;--- See if "special" extn ----------- if FtpFileExtn = "DIZ" then FtpDoThisFile = 'N'; ;;Don't want in listing! end; ;--- Check if special file ------------------------------- ThisFile = translate(_filespec('name', FtpFile)); if ThisFile = translate("<$FTPLIKE_CMD_FILE_DIR>") then FtpDoThisFile = 'N'; ;;Don't want in listing! #DefineRexx #define FTPLIKE_DO_THIS_FILE \ #evaluate '' ^<$FTPLIKE_DO_THIS_FILE_REXX>^ #endif ;--- Define "DIZ" handler ------------------------------------------------ #ifndef FTPLIKE_GET_FILE_COMMENT #DefineRexx FTPLIKE_GET_FILE_COMMENT FtpDizFile = stream(FtpFile || '.diz', 'c', 'query exists'); if FtpDizFile = '' then; do; ;--- Try changing extension to ".diz" --- FtpPos = lastpos('.', FtpFile); if FtpPos <> 0 then; FtpDizFile = stream(left(FtpFile,FtpPos) || 'DIZ', 'c', 'query exists'); end; if FtpDizFile = '' then; FtpComment = ''; else; do; ;--- Have a comment file! --------------- call AddInputFileToDependancyList(FtpDizFile); FtpComment = charin(FtpDizFile, 1, 99999); call DieIfIoErrorOccurred FtpDizFile; CloseRc = stream(FtpDizFile, 'c', 'close'); <$FTPLIKE_DIZ_TRANSLATION_REXX> FtpComment = {$Prefix=^''^} || FtpComment || {$Suffix=^''^}; end; #DefineRexx #endif #ifndef FTPLIKE_ADD_FILE_COMMENT #define FTPLIKE_ADD_FILE_COMMENT \ #if [FtpComment <> ''] -\


-\ #endif -\ #endif #ifndef FTPLIKE_HANDLE_DIRKEY_DIRTEXT #DefineRexx REXX_FTPLIKE_HANDLE_DIRKEY_DIRTEXT ;--- User specify Text key? ---------------------------------- FtpKey = DirStore || 'DIRTEXT'; if RexxVarDefined(FtpKey) then call ProcessNext _valueG(FtpKey); #DefineRexx #define FTPLIKE_HANDLE_DIRKEY_DIRTEXT \ #evaluate ^^ ^<$REXX_FTPLIKE_HANDLE_DIRKEY_DIRTEXT>^ #endif ;--- Define "DIZ" translations ------------------------------------------- #ifndef FTPLIKE_DIZ_TRANSLATION_REXX #define FTPLIKE_DIZ_TRANSLATION_REXX \ FtpComment = ReplaceString(FtpComment, '1A'x, ''); ;;EOF char ;;;;;; FtpComment = ReplaceString(FtpComment, '0D0A0D0A'x, '0D0A'x || '

'); #endif ;--- Define how directories are SORTED (just rexx) ----------------------------- #ifndef FTPLIKE_DIRECTORY_SORT_REXX #DefineRexx 'FTPLIKE_DIRECTORY_SORT_REXX' #OneLine <$GenRexx2Sort COUNT=^{$ArrayName}.0^ GREATER=^SrtGreater = {$ArrayName}.SrtIndex1.!SortKey > {$ArrayName}.SrtIndex2.!SortKey^ SWAP=^ SrtTemp = {$ArrayName}.SrtIndex1; {$ArrayName}.SrtIndex1 = {$ArrayName}.SrtIndex2; {$ArrayName}.SrtIndex2 = SrtTemp; SrtTemp = {$ArrayName}.SrtIndex1.!Description; {$ArrayName}.SrtIndex1.!Description = {$ArrayName}.SrtIndex2.!Description; {$ArrayName}.SrtIndex2.!Description = SrtTemp; SrtTemp = {$ArrayName}.SrtIndex1.!FtpShortR; {$ArrayName}.SrtIndex1.!FtpShortR = {$ArrayName}.SrtIndex2.!FtpShortR; {$ArrayName}.SrtIndex2.!FtpShortR = SrtTemp; SrtTemp = {$ArrayName}.SrtIndex1.!RealDirTree; {$ArrayName}.SrtIndex1.!RealDirTree = {$ArrayName}.SrtIndex2.!RealDirTree; {$ArrayName}.SrtIndex2.!RealDirTree = SrtTemp; SrtTemp = {$ArrayName}.SrtIndex1.!SortKey; {$ArrayName}.SrtIndex1.!SortKey = {$ArrayName}.SrtIndex2.!SortKey; {$ArrayName}.SrtIndex2.!SortKey = SrtTemp; ^ > #OneLineEnd #DefineRexx #endif ;--- Define how files are SORTED ----------------------------------------- #ifndef FTPLIKE_FILE_SORT_REXX #DefineRexx 'FTPLIKE_FILE_SORT_REXX' call SortArray '{$ArrayName}' #DefineRexx #endif ;--- Load all special definition files ----------------------------------- #DefineRexx '' ;--- Get list of alias files ----------------------------------------- FtpAlias.0 = 0; call _SysFileTree '<$FTPLIKE_DIRECTORY $$SQx2><$FTPLIKE_CMD_FILE_DIR>', 'FtpAlias', 'FOS'; call Debug 'Found ' || FtpAlias.0 || ' files matching "<$FTPLIKE_CMD_FILE_DIR>"' ;--- Work through list making alias -> directory mapping ------------- LongKey = 'N'; call DebugIndent 1; do Index = 1 to FtpAlias.0 ;--- Name of this file? Give it an "storage slot" ---------------- #if ['' = 'UNIX'] FtpCmdFile.1 = FtpAlias.Index; ;;Unix is case sensitive #else FtpCmdFile.1 = translate(FtpAlias.Index); ;;Make upper case #endif StoreUnder = 'dirattr' || Index || '.!'; call Debug 'Processing: "' || FtpCmdFile.1 || '"' ;--- Map directory to "slot" (so we can retrieve info later) ----- FtpCmdFileDir = _filespec('location', FtpCmdFile.1); <$c2x ResultVar="KeyCode" KeyVar="FtpCmdFileDir"> call _valueS "FtpDir2Slot.!" || KeyCode, StoreUnder; ;--- Load all fields from file ----------------------------------- call AddInputFileToDependancyList(FtpCmdFile.1); FileIndex = 1; LongKey = 'N'; FtpCmdFileL.FileIndex = 0; CloseRc = stream(FtpCmdFile.FileIndex, 'c', 'close'); call DebugIndent 1; FtpBuffer = ''; NlChar = d2c(10); InLine = ';' || ';'; do forever ;--- Read the next line (Anything in buffer?) ---------------- if FtpBuffer <> '' then do ;--- Get line from buffer -------------------------------- #option PUSH AllowPack=OFF parse var FtpBuffer CmdLine (NlChar) FtpBuffer; #option POP ShowL = '!'; ShowR = '!'; end; else do ;--- At EOF? ------------------------------------------------- if lines(FtpCmdFile.FileIndex) = 0 then do ;--- At EOF ---------------------------------------------- CloseRc = stream(FtpCmdFile.FileIndex, 'c', 'close'); if FileIndex = 1 then leave; ;;At EOF on main file else do FileIndex = FileIndex - 1; ;;At EOF of included file call DebugIndent -1; end; end; ;--- Read the line from the file ------------------------- FtpCmdFileL.FileIndex = FtpCmdFileL.FileIndex + 1; CmdLine = strip(ReplaceString(linein(FtpCmdFile.FileIndex), d2c(9), ' ')); ShowL = '['; ShowR = ']'; end; call Debug ShowL || FtpCmdFileL.FileIndex || ShowR || ': ' || CmdLine; ;--- Is the line a comment? ---------------------------------- if CmdLine = '' | left(CmdLine, 1) = ';' then iterate; ;--- Does the line have an inline comment? ------------------- LineComPos = lastpos(InLine, CmdLine); if LineComPos <> 0 then do ;--- Have an inline comment ------------------------------ CmdLine = strip(left(CmdLine, LineComPos-1)); end; ;--- Handle any macros the line might contain ---------------- NowCount = ReplaceCount; CmdLine = ReplaceMacros(CmdLine); ;--- Any Changes made? --------------------------------------- if NowCount <> ReplaceCount then do ;--- Add to buffer (in front) ---------------------------- if FtpBuffer = '' then FtpBuffer = CmdLine; else FtpBuffer = CmdLine || NlChar || FtpBuffer; ;--- Thats all for now ----------------------------------- iterate; end; ;--- See if #include command --------------------------------- if translate(word(CmdLine, 1)) = "#INCLUDE" then do ;--- Including new file ---------------------------------- call DebugIndent 1; Rest = subword(CmdLine, 2); if length(Rest) < 3 | left(Rest, 1) <> '"' | right(Rest, 1) <> '"' then CryAndDie('Incorrectly nested #include command in "' || FtpCmdFile.FileIndex || '"', 'The command was "' || CmdLine || '"'); FileIndex = FileIndex + 1; FtpCmdFile.FileIndex = substr(Rest, 2, length(Rest)-2); CloseRc = stream(FtpCmdFile.FileIndex, 'c', 'close'); iterate; end; ;--- Are we "collecting" a mult line key? -------------------- if LongKey = 'N' then do ;--- Not collecting yet, is this the start? -------------- if left(CmdLine, 1) = '>' then do ;--- Start of collection ----------------------------- parse value strip(substr(CmdLine,2)) with ValueVar RexxExpression; ValueVar = translate(ValueVar); if RexxExpression = '' then ValueSep = d2c(0); else interpret 'ValueSep = ' || RexxExpression; ItsValue = ''; EndsWith = '<' || ValueVar; LongKey = 'Y'; iterate; end; ;--- Get value into rexx variable ------------------------ parse var CmdLine ValueVar'='ItsValue; ValueVar = translate(strip(ValueVar)); ItsValue = strip(ItsValue); ;--- Alias variable is a special case -------------------- if ValueVar = "ALIAS" then do ;--- Create Alias to directory "link" ---------------- TheDir = _filespec('location', FtpCmdFile.FileIndex); if right(TheDir, 1) = '' then TheDir = left(TheDir, length(TheDir)-1); <$c2x ResultVar="KeyCode" KeyVar="ItsValue"> call _valueS "FtpAlias2Dir.!" || KeyCode, TheDir; end; end; else do ;--- End of the block? ----------------------------------- if translate(CmdLine) = EndsWith then LongKey = 'N'; else do ;--- Not yet finished -------------------------------- if ItsValue == '' then ItsValue = CmdLine; else ItsValue = ItsValue || ValueSep || CmdLine; iterate; end; end; ;--- Save away for later (very quick access) ----------------- call _valueS StoreUnder || ValueVar, ItsValue; end; call DebugIndent -1; ;--- Finished processing the $$$ file, do some valiadtion -------- if LongKey = 'Y' then CryAndDie('The multline key of "' || ValueVar || '"' in "' || FtpCmdFile.1 || '"' was not completed'); end; call DebugIndent -1; FtpAlias2Dir.0 = FtpAlias.0; #DefineRexx #ifndef FTPLIKE_USER_DIR_ATTRIB_PUSH_CHANGE #define FTPLIKE_USER_DIR_ATTRIB_PUSH_CHANGE ;;Allow user to override for own directory attributes #endif #ifndef FTPLIKE_USER_DIR_ATTRIB_POP #define FTPLIKE_USER_DIR_ATTRIB_POP ;;Allow user to override for own directory attributes #endif ;--- Make sure not done again (when a directory being processed etc) ----- #define _FTPLIKE_INITIALIZED #endif ;--- Don't need to read following comments! --------------------------------- #EOF ;---------------------------------------------------------------------------- ; ; This header contains all initialization code and ; has been seperated so that it need not be included ; for every folder! These comments have been placed ; at the end of the file so they don't have to be ; read at all. ; ; This allows you to create FTP like pages without ; having to do a lot of work. Simply add the file ; to a directory will get it onto the correct HTML ; page. ; ; It would be wise to generate pages into their own ; directory on the off chance that this header file ; picks a name for a directory's file which matches ; one of yours! ; ; Note that most of the code below is tricky only ; because I made it generic (ie very configurable), ; a specific implementation would be much smaller ; and much much easier to write as well! ; ; The whole look and feel of the generated data may ; be modified. ; ; It would be simple to have your normal look and feel ; items such as headers, footers backgrounds etc ; integrated into the generated output. ; ; Description file support (.diz) is available for files, ; directories have an alternative mechanism. ; Note that the file can (and probably should) contain ; normal HTML formatting tags - by default anyway. ; If you have a file called "stuff.zip" this header ; will look for "stuff.zip.diz" and "stuff.diz". ; ; You should not modify the value of any definition ; that begins with an "_", you can modify virtually ; anything else. ; ; Note that dependancy checking does not make sense ; in this type of situation as files can appear simply ; by matching the wildcard. For this reason I do not ; bother with using the "#dependsOn INPUT" command for ; each file I process. ; ; ; NOT COMPLETE ; ~~~~~~~~~~~~ ; This header has been hacked around a bit and could ; be simplified/improved, I will probably never do this ; because of a lack of time and the fact that it works! ; ; ; SUPPORTED OPERATING SYSTEMS ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; It is intended that all operating systems that PPWIZARD ; supports can also use this header, if you find that ; it does not work then please send me the output when ; you have used the "/debug" command line switch. Please ; also include a directory listing of the directory(s) you ; are processing. ; ; ; EXAMPLE - LINUX ; ~~~~~~~~~~~~~~~ ; #define FTPLIKE_FOLLOW_SUBDIRECTORIES ; #define FTPLIKE_USE_LONG_FILENAMES ; #define FTPLIKE_DIRECTORY /home/dennis/ ; #define FTPLIKE_DIRECTORY_WEB http://ftp ; #include "ftplike.ih" ; ; ; EXAMPLE - OS/2, WINDOWS ; ~~~~~~~~~~~~~~~~~~~~~~~ ; #define FTPLIKE_FOLLOW_SUBDIRECTORIES ; #define FTPLIKE_USE_LONG_FILENAMES ;;Remove this definition for 8.3 names ; #define FTPLIKE_DIRECTORY C:\TMP\ASM_MAC ; #define FTPLIKE_DIRECTORY_WEB file:///C|TMP/ASM_MAC ;;Local testing ; #include "FTPLIKE.IH" ; ; ; HELP WANTED ; ~~~~~~~~~~~ ; I use "find" under linux, is there a expression that ; I can pass to "-name" to display all files/directories? ; ; ; ; SOME PPWIZARD VARIABLES EXPLAINED ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; FTPLIKE_CMD_FILE_DIR (default "dirattr.$$$") ; Defines the name of a control file that contains ; extra information about the directory containing ; it. Leading and trailing whitespace, Blank lines ; and lines starting with ';' are all ignored. ; ; As usual inline comments start with ';;' and ; macros are replaced. ; ; To generate multiple lines each must be seperated ; by "dc2(10)", you can not use "%\" line ; continuation or "" or similar ; definitions. As an example: ; ; #evaluate "Eol" "d2c(10)" ; #define LookAndFeelForOs2 \ ; BgImage = image/os2warp.jpg<$Eol> -\ ; BgColor = #E0E0E0 ; ; ; This file allows you to set a key to a value, ; it allows any key to be used so as to support ; ones that you might wish to create and use. ; ; There are 2 types of "assignment", for a short ; value that can fit on one line the following ; format can be used: ; ; Key = Value ; ; Where you need to specify longer values the ; following format can be used: ; ; >Key [Expression] ; Value Line 1 ; Value Line 2 ; ; ; * LINKCOLOR ; The link color use for the directory tree ; (for body tag), example: ; ; LINKCOLOR = #3333FF ; ; * ALINKCOLOR ; The active link color ; ; * VLINKCOLOR ; The visited link color ; ; * BODYOTHER ; Any other body related tags not specified by other ; options for the directory tree, example: ; ; BODYOTHER = LEFTMARGIN=5 TOPMARGIN=5 MARGINWIDTH=5 MARGINHEIGHT=5 ; ; SOME REXX VARIABLES EXPLAINED ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; FtpShortR : Current file/dir without drive/path ; FtpShortD : Descriptive version of "FtpShortR" ; ;----------------------------------------------------------------------------