home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 18 REXX / 18-REXX.zip / cedit2.zip / CEDIT.CMD next >
OS/2 REXX Batch file  |  1993-11-05  |  27KB  |  652 lines

  1. /*
  2. program: CEDIT.cmd
  3. type:    REXXSAA-OS/2, version 2.x
  4. purpose: Edit Config.SYS File
  5. version: 1.0
  6. date:    1992-08-27 (Internal)
  7. changed: 1.1 1992-09-13 (Internal)
  8.              -SET logic to allow additon of variable
  9.               if it doesn't currently exist
  10.              -Allow no duplicate directory adds on path or set statements
  11.                 (only valid if input has semicollons!!)
  12.          2.0 1992-10-06 (External)
  13.              -Can Now accept flags from the command line.
  14.              -Commands changed for clarity.
  15.          2.1 1993-03-11
  16.              -Hide some additional output.
  17.          2.2 1993-05-17
  18.              -Standardize Global variables.
  19.          3.0 1993-06-04 (Internal Beta)
  20.              -Allow deletion of directories from paths...
  21.          3.0a 1993-06-05 
  22.              -Allow deletion of directories from paths...
  23.          3.1 1993-11-05
  24.              -Tell when error caused by bad paths.
  25.              -Check for error on return from Global_Set.
  26.  
  27.              
  28.  
  29. author:  Byron Stephan
  30.          Pennsylvania Blue Shield,
  31.          External: Email through OS/2 Shareware BBS
  32.          Internal: Call x25395
  33.  
  34. needs:   OS/2 2.0 & Rexx Fixes,
  35.          GLOBAL_SET rexx procedure and it's requirements.
  36.             --Global_Set is a standard routine to retrieve
  37.               UserID, UserName, MachineName & Set the ANSI colors.
  38.             --Loads OS/2 REXXUtil Functions,
  39.               For Standard Utility Functions
  40.             --Loads YDBAUTIL.DLL from RXU11.ZIP,
  41.               Need to return Global. Stem variable to calling program.
  42.  
  43. Plans:   Only attempt to backup or copy if changes have been made.
  44.          Need to standardize the Input logic for both File and Command-line
  45.          Should check when a directory is involved that a Semi-colon is on the end.
  46.          Should have SET input flag as error attempt to modify PATH, DPATH, ...
  47.          ?Error if SET line previously had a semi-colon ending it?
  48.  
  49. Problems: Will not accept '/' in variables from Command line...
  50.           --Works fine through file...
  51.           --Hardcoding in Backup_File procedure.
  52.  
  53. All rights reserved, copyrighted 1992, 1993, no guarantee that it works without
  54. errors, etc. etc.
  55.  
  56. donated to the public domain granted that you are not charging anything (money
  57. etc.) for it and derivates based upon it, as you did not write it,
  58. etc. if that holds you may bundle it with commercial programs too
  59.  
  60. you may freely distribute this program, granted that no changes are made
  61. to it.
  62.  
  63. Please, if you find an error, post me a message describing it, I will
  64. fix and rerelease it. And if you have good suggestions send me an Email and I will
  65. see about adding it.
  66.  
  67. procedures:
  68.  
  69.  
  70. usage:   CEDIT /?  _____
  71.          CEDIT /H       \ --- Help
  72.          CEDIT     _____/
  73.  
  74.          CEDIT /FH ---------- File Command Help
  75.  
  76. syntax:
  77.  
  78. flags:
  79.     See Help usage above.
  80.  
  81. */
  82.  
  83. /****************************************************************
  84. ** Set up error handling.
  85. ** Initialize.
  86. ** Parse Command line arguments.
  87. ** Process commands.
  88. *****************************************************************/
  89.  
  90.  
  91. SIGNAL ON FAILURE NAME Error
  92. SIGNAL ON HALT NAME Halt
  93. SIGNAL ON ERROR NAME Error
  94. SIGNAL ON SYNTAX NAME Error
  95.  
  96. global. = ""
  97. LocalGlobal. = ""
  98.  
  99. CALL Initialize                 /* initialize array "global."           */
  100. CALL parse_args ARG(1)
  101. CALL Process
  102. exit
  103.  
  104.  
  105. Initialize: PROCEDURE EXPOSE global. LocalGlobal.
  106. /****************************************************************
  107. ** Set global variables.
  108. ** Set Standard LocalGlobal variables.
  109. ** Initialize Variables needed between functions.
  110. *****************************************************************/
  111.    if Global_Set() <> 0 then do
  112.       Say 'Unable to Initialize!'
  113.       exit -1
  114.    end
  115.    numvar = rxVlist(, 'G', 'GlobalQueue')
  116.  
  117.    parse source LocalGlobal.OS LocalGlobal.CommandType LocalGlobal.RexxPathName
  118.    LocalGlobal.ProgramName = substr(LocalGlobal.RexxPathName,lastpos('\',LocalGlobal.RexxPathName)+1)
  119.  
  120.    LocalGlobal.Version = "3.1"
  121.    LocalGlobal.Program = global.ibrightyellow||LocalGlobal.ProgramName,
  122.                       ||" ("global.ibrightblue||LocalGlobal.Version||global.iBrightyellow,
  123.                       ||"):"global.iNormal
  124.    LocalGlobal.Author = global.ibrightgreen"Byron Stephan"global.iNormal
  125.    
  126.    LocalGlobal.cLibpath = ""
  127.    LocalGlobal.cPath    = ""
  128.    LocalGlobal.cDPath   = ""
  129.    LocalGlobal.cDelLibpath = ""
  130.    LocalGlobal.cDelPath    = ""
  131.    LocalGlobal.cDelDPath   = ""
  132.    LocalGlobal.AddBegin = ""
  133.    LocalGlobal.AddEnd  = ""
  134.    LocalGlobal.AddBegin.0 = 0
  135.    LocalGlobal.AddEnd.0  = 0
  136.    LocalGlobal.SetVar.0  = 0
  137.    LocalGlobal.ConfigFile = "Config.sys"
  138.  
  139. RETURN
  140.  
  141. Parse_ARGS: PROCEDURE EXPOSE Global. LocalGlobal.
  142. /****************************************************************
  143. ** If no arguments or Help switches.
  144. **    Goto Help Display
  145. ** Parse various switches until no more switches.
  146. ** --While switches exist...
  147. ** --   Find next switch
  148. ** --   Parse Switch & Value to seperate them out
  149. ** --   (Note: Requires that a colon exist as part of the switch)
  150. ** --   For switch do appropriate action
  151. *****************************************************************/
  152.  
  153. If ARG(1) = '' | POS('/?',ARG(1)) | POS('/H',TRANSLATE(ARG(1))) THEN
  154.    SIGNAL Usage
  155. If POS('/FH',TRANSLATE(ARG(1))) THEN
  156.    SIGNAL FileUsage
  157.  
  158.  
  159. SwitchPos = pos('/',ARG(1))
  160. Do While SwitchPos > 0
  161.    EndOfSwitchInd = pos(':',value,SwitchPos)
  162.    if EndOfSwitchInd < 1 then 
  163.       EndSwitchPos = Length(arg(1))
  164.    else do
  165.       EndSwitchPos = pos('/',value,pos(':',value,SwitchPos)) - 1
  166.       if EndSwitchPos < 1 then
  167.          EndSwitchPos = Length(arg(1))
  168.    end
  169.  
  170.    Switch_value = substr(arg(1),SwitchPos,EndSwitchPos)
  171.  
  172.    parse value Switch_Value with '/' Switch ':' Value 
  173.    Switch = TRANSLATE(Switch)
  174.    Select
  175.       /* Save Line to add at beginning of Config.Sys */
  176.       when Switch = 'B' then do 
  177.          LocalGlobal.AddBegin.0 = LocalGlobal.AddBegin.0 + 1
  178.          iTemp = LocalGlobal.AddBegin.0
  179.          LocalGlobal.AddBegin.iTemp = value
  180.       end  /* Do */
  181.  
  182.       /* Save line to add at end of Config.Sys */
  183.       when Switch = 'E' then do
  184.          LocalGlobal.AddEnd.0 = LocalGlobal.AddEnd.0 + 1
  185.          iTemp = LocalGlobal.AddEnd.0
  186.          LocalGlobal.AddEnd.iTemp = value
  187.       end  /* Do */
  188.  
  189.       /* Get Commands from a file */
  190.       when Switch = 'F' then do
  191.          global.filein = STRIP(Value)          /* get rid of leading and trailing spaces */
  192.          global.eFilein = STREAM(global.filein, "C", "QUERY EXISTS") /* File exists? */
  193.  
  194.          IF global.eFilein = "" THEN do
  195.             SAY Global.Program": file "||global.iGreen||"["||global.iCyan || global.filein || global.iGreen||"]"||global.iNormal" does not exist."
  196.             EXIT -2
  197.          END
  198.          else
  199.             call Read_File
  200.       end  /* Do */
  201.  
  202.       /* Save Directory to add at end of LIBPath. */
  203.       when Switch = 'L' then
  204.          LocalGlobal.cLibpath = LocalGlobal.cLibpath||value
  205.  
  206.       /* Save Directory to add at end of DPath. */
  207.       when Switch = 'D' then
  208.          LocalGlobal.cDPath = LocalGlobal.cDPath||value
  209.  
  210.       /* Save Directory to add at end of Path. */
  211.       when Switch = 'P' then
  212.          LocalGlobal.cPath = LocalGlobal.cPath||value
  213.  
  214.       /* Save Directory to delete from LIBPath. */
  215.       when Switch = 'LDELDIR' then
  216.          LocalGlobal.cDelLibPath = LocalGlobal.cDelLibPath||value
  217.  
  218.       /* Save Directory to delete from DPath. */
  219.       when Switch = 'DDELDIR' then
  220.          LocalGlobal.cDelDPath = LocalGlobal.cDelDPath||value
  221.  
  222.       /* Save Directory to delete from Path. */
  223.       when Switch = 'PDELDIR' then
  224.          LocalGlobal.cDelPath = LocalGlobal.cDelPath||value
  225.  
  226.       /* Save Set Values to Add or replace. */
  227.       when Switch = 'S' then do
  228.          /* If SET keyword exists then add value to keywords value 
  229.          ** else add new SET keyword and value. 
  230.          */ 
  231.          eVariableFound = 0
  232.          PARSE VALUE value WITH keyword "=" value
  233.  
  234.          DO iTemp = 1 TO LocalGlobal.SetVar.0
  235.             if LocalGlobal.SetVar.Keys.itemp = TRANSLATE(keyword) then do
  236.                LocalGlobal.SetVar.KeyValue.iTemp = LocalGlobal.SetVar.KeyValue.iTemp||value
  237.                eVariableFound = 1
  238.             END
  239.          END
  240.          if eVariableFound = 0 then DO
  241.             LocalGlobal.SetVar.0 = LocalGlobal.SetVar.0 + 1
  242.             iTemp = LocalGlobal.SetVar.0
  243.  
  244.             LocalGlobal.SetVar.Keys.iTemp = TRANSLATE(keyword)
  245.             LocalGlobal.SetVar.KeyValue.iTemp   = value
  246.             LocalGlobal.SetVar.SetExists.iTemp = 0
  247.          end
  248.       END
  249.  
  250.    otherwise
  251.       /* Unknown switch - show help */
  252.       Signal Usage
  253.  
  254. end  /* select */
  255.  
  256. RETURN
  257.  
  258. Read_File: PROCEDURE EXPOSE global. LocalGlobal.
  259. /****************************************************************
  260. ** While not EOF
  261. **    Read line.
  262. **    Ignore comments and blank lines.
  263. **    Parse file input
  264. **    If problem
  265. **       show line and exit
  266. *****************************************************************/
  267. SAY "Reading Command file..."
  268.  
  269. iline_no = 0             /* line-number */
  270. DO WHILE LINES(global.filein) > 0
  271.    line = LINEIN(global.filein)
  272.    iline_no = iline_no + 1
  273.  
  274.    /* no empty lines and no comments */
  275.    IF line = "" | SUBSTR(STRIP(line), 1, 2) = "--" THEN ITERATE
  276.  
  277.    SAY "parsing "||global.iGreen||"["||global.iNormal || line || global.iGreen||"]"||global.iNormal
  278.  
  279.    IF Parse_File_Input(line, iline_no) > 0 THEN do
  280.       SAY global.iredwhite
  281.       SAY "Line No:" iline_no
  282.       SAY ">>> " line global.inormal
  283.       SAY 
  284.       exit -3
  285.    END
  286. END
  287.  
  288. CALL STREAM global.filein, "C", "CLOSE"        /* make sure file is closed */
  289.  
  290. RETURN
  291.  
  292. Process: PROCEDURE EXPOSE global. LocalGlobal.
  293. /****************************************************************
  294. ** Update temporary file.
  295. ** Backup Config.sys file
  296. ** If no problems then replace config.sys with temporary file.
  297. *****************************************************************/
  298.  
  299. SAY "Creating temporary file..."
  300.  
  301. cTempFilename = SysTempFileName(Global.Bootdrive||'\Temp????.CON')
  302. DO WHILE LINES(global.bootdrive||"\"||LocalGlobal.ConfigFile) > 0
  303.    line = LINEIN(global.bootdrive||"\"||LocalGlobal.ConfigFile)
  304.    UPPERline = TRANSLATE(LINE)
  305.  
  306.    SELECT
  307.       WHEN ("IFS=" = SUBSTR(UPPERline,1,4)) THEN do
  308.          CALL LINEOUT cTempFilename, line
  309.          DO iTemp = 1 TO LocalGlobal.AddBegin.0
  310.             CALL LINEOUT cTempFilename,LocalGlobal.AddBegin.iTemp
  311.          END
  312.       END
  313.       WHEN ("LIBPATH=" = SUBSTR(UPPERline,1,8)) THEN do
  314.          Path = CheckPath(upperline, LocalGlobal.cLibpath,, LocalGlobal.cDelLibpath)
  315.          CALL LINEOUT cTempFilename,path 
  316.       end
  317.       WHEN ("SET PATH=" = SUBSTR(UPPERline,1,9)) THEN do
  318.          Path = CheckPath(upperline, LocalGlobal.cPath,'', LocalGlobal.cDelPath)
  319.          CALL LINEOUT cTempFilename,Path
  320.       end
  321.       WHEN ("SET DPATH=" = SUBSTR(UPPERline,1,10)) THEN do
  322.          Path = CheckPath(upperline,LocalGlobal.cDPath,'', LocalGlobal.cDelDPath)
  323.          CALL LINEOUT cTempFilename,path 
  324.       end
  325.       WHEN ("SET " = SUBSTR(UPPERline,1,4)) THEN do
  326.          if LocalGlobal.SetVar.0 = 0 then
  327.             CALL LINEOUT cTempFilename,line 
  328.          else
  329.             DO
  330.             eKeywordFound = 0
  331.             DO iTemp = 1 TO LocalGlobal.SetVar.0
  332.                PARSE VAR UPPERline with "SET " keyword "=" 
  333.                if LocalGlobal.SetVar.keys.iTemp = keyword then
  334.                   DO
  335.                   Path = CheckPath(upperline,LocalGlobal.SetVar.KeyValue.iTemp,"Set","","")
  336.                   CALL LINEOUT cTempFilename,path
  337.                   eKeywordFound = 1
  338.                   LocalGlobal.SetVar.SetExists.iTemp = 1
  339.                   END
  340.             END
  341.             if eKeywordFound = 0 then
  342.                CALL LINEOUT cTempFilename,line 
  343.             END
  344.       END
  345.     OTHERWISE
  346.          CALL LINEOUT cTempFilename,line 
  347.    END
  348. END
  349.  
  350. DO iTemp = 1 TO LocalGlobal.SetVar.0
  351.    if LocalGlobal.SetVar.SetExists.iTemp = 0 then do
  352.        Path = CheckPath("",LocalGlobal.SetVar.KeyValue.iTemp,"Set")
  353.        CALL LINEOUT cTempFilename, "SET "||LocalGlobal.SetVar.keys.iTemp||"="||path
  354.    END
  355. END
  356.  
  357.  
  358. DO iTemp = 1 TO LocalGlobal.AddEnd.0
  359.    CALL LINEOUT cTempFilename,LocalGlobal.AddEnd.iTemp 
  360. END
  361. CALL STREAM cTempFilename, "C", "CLOSE"        /* make sure file is closed */
  362. CALL STREAM global.bootdrive||"\"||LocalGlobal.ConfigFile, "C", "CLOSE"        /* make sure file is closed */
  363.  
  364. call backup_file global.bootdrive||"\"||LocalGlobal.ConfigFile
  365.  
  366. SAY "Updating "||LocalGlobal.ConfigFile||" file..."
  367.  
  368. "@copy "||cTempFilename||" "||global.bootdrive||"\"||LocalGlobal.ConfigFile
  369. RCODE=rc
  370.  
  371. RC = SysFileDelete(cTempFilename)
  372. if RC = 0 then
  373.    exit 0
  374. else
  375.    do
  376.    say global.red||"ERROR!! File could not be deleted!!"||global.inormal
  377.    exit -2
  378.    end
  379. */
  380. Say "Finished..."
  381. return 0
  382.  
  383. Backup_File: PROCEDURE EXPOSE global. LocalGlobal.
  384. /****************************************************************
  385. ** Backup file with Backini if exists
  386. ** else do generic backup
  387. *****************************************************************/
  388. original_file = arg(1)
  389.  
  390. SAY "Backing up "||LocalGlobal.ConfigFile||" file..."
  391.  
  392. "@k:\public\util\backini.exe "||original_file||" 5 >NUL 2>&1"
  393.  
  394. /*BackiniPath = SysSearchPath('PATH','Backini.exe')
  395. if BackiniPath<>"" then do
  396.     "@"||BackiniPath||" "||original_file||" 25"
  397.     RCODE=rc
  398. end
  399. else do
  400.    iBackup = 0
  401.    DO FOREVER
  402.       iBackup = iBackup + 1
  403.       extension = lastpos(".", original_file)
  404.       if extension = 0 then do
  405.          extension = length(original_file) + 1
  406.          backup_file = original_file||"."||iBackup
  407.       end
  408.       else
  409.          backup_file = substr(original_file,1,extension)||iBackup
  410.  
  411.       global.eBackup = STREAM("CONFIG."||iBackup, "C", "QUERY EXISTS")
  412.  
  413.       IF global.eBackup = "" THEN do
  414.          "copy "||original_file||" "||backup_file
  415.          RCODE=rc
  416.          leave
  417.       END /* End-If */
  418.    END /* End-DO */
  419. END /* End-Else */
  420. */
  421. return 0
  422.  
  423. Parse_File_Input: PROCEDURE EXPOSE global. LocalGlobal.
  424. /****************************************************************
  425. ** Parse file records for keywords.
  426. ** If unknown keyword exists then return bad error code.
  427. *****************************************************************/
  428.  
  429. to_parse = ARG(1)
  430. line_no  = ARG(2)
  431. iErrorExists = 0
  432.  
  433. PARSE VALUE to_parse WITH keyword "=" value
  434.  
  435. SELECT
  436.    WHEN translate(keyword) = "LIBPATH" THEN
  437.       LocalGlobal.cLibpath = LocalGlobal.cLibpath||value
  438.    WHEN translate(keyword) = "DPATH" THEN
  439.       LocalGlobal.cDPath = LocalGlobal.cDPath||value
  440.    WHEN translate(keyword) = "PATH" THEN
  441.       LocalGlobal.cPath = LocalGlobal.cPath||value
  442.    WHEN translate(keyword) = "DELLIBPATH" THEN
  443.       LocalGlobal.cDelLibpath = LocalGlobal.cDelLibpath||value
  444.    WHEN translate(keyword) = "DELDPATH" THEN
  445.       LocalGlobal.cDelDPath = LocalGlobal.cDelDPath||value
  446.    WHEN translate(keyword) = "DELPATH" THEN
  447.       LocalGlobal.cDelPath = LocalGlobal.cDelPath||value
  448.    WHEN translate(keyword) = "ADDBEGIN" THEN
  449.       DO
  450.       LocalGlobal.AddBegin.0 = LocalGlobal.AddBegin.0 + 1
  451.       iTemp = LocalGlobal.AddBegin.0
  452.       LocalGlobal.AddBegin.iTemp = value
  453.       END
  454.    WHEN translate(keyword) = "ADDEND" THEN
  455.       DO
  456.       LocalGlobal.AddEnd.0 = LocalGlobal.AddEnd.0 + 1
  457.       iTemp = LocalGlobal.AddEnd.0
  458.       LocalGlobal.AddEnd.iTemp = value
  459.       END
  460.    WHEN translate(keyword) = "SETVAR" THEN
  461.       DO
  462.       eVariableFound = 0
  463.       PARSE VALUE value WITH keyword "=" value
  464.  
  465.       DO iTemp = 1 TO LocalGlobal.SetVar.0
  466.          if LocalGlobal.SetVar.Keys.itemp = TRANSLATE(keyword) then
  467.             DO
  468.             LocalGlobal.SetVar.KeyValue.iTemp = LocalGlobal.SetVar.KeyValue.iTemp||value
  469.             eVariableFound = 1
  470.             END
  471.       END         
  472.       if eVariableFound = 0 then
  473.          DO
  474.          LocalGlobal.SetVar.0 = LocalGlobal.SetVar.0 + 1
  475.          iTemp = LocalGlobal.SetVar.0 
  476.  
  477.          LocalGlobal.SetVar.Keys.iTemp = TRANSLATE(keyword)
  478.          LocalGlobal.SetVar.KeyValue.iTemp   = value
  479.          LocalGlobal.SetVar.SetExists.iTemp = 0
  480.          end
  481.       END
  482.    OTHERWISE
  483.       iErrorExists = iErrorExists + 1
  484. END
  485.  
  486. RETURN iErrorExists
  487.  
  488. CheckPath: PROCEDURE expose global. localglobal.
  489. /****************************************************************
  490. ** If new value for SET statment doesn't have semi-colon 
  491. **    Replace SET value
  492. ** else 
  493. **    Check PATH being built for duplicate directory.
  494. *****************************************************************/
  495. line = arg(1)
  496. Value = arg(2)
  497. Parse upper var value value
  498. Source = arg(3)
  499. DelValue = arg(4)
  500. Parse upper var delvalue delvalue
  501. path = line
  502. startingpos = pos('=',value) + 1
  503. lastpos = pos(';',value)
  504. if translate(source) = 'SET' & lastpos = 0 then do
  505.    SetStatement = substr(line,1,pos('=',line))||value
  506.    return SetStatement
  507. end
  508. else
  509.    If DelValue <> '' then do
  510.       lastpos = pos(';',DelValue)
  511.       do while lastpos > 0
  512.          subvalue = translate(substr(DelValue,startingpos,lastpos-startingpos+1))
  513.          if pos(subvalue, path) > 0 then
  514.             path = DELSTR(path,pos(subvalue, path), length(subvalue))
  515.          else
  516.             Say 'DelValue '||subvalue||' doesn''t exist in '||line
  517.          Startingpos = lastpos + 1
  518.          lastpos = pos(';',DelValue,startingpos)
  519.       end
  520.    end
  521.  
  522.    If Value <> '' then do
  523.       lastpos = pos(';',value)
  524.       do while lastpos > 0
  525.          subvalue = translate(substr(value,startingpos,lastpos-startingpos+1))
  526.          if pos(subvalue, path) > 0 then
  527.             nop /*Say 'Value '||subvalue||' already exists in '||line*/
  528.          else
  529.             path = path||subvalue
  530.          Startingpos = lastpos + 1
  531.          lastpos = pos(';',value,startingpos)
  532.       end
  533.    end
  534. trace off
  535. return path
  536.  
  537.  
  538. Pause: procedure
  539. /****************************************************************
  540. ** Politely Pause
  541. *****************************************************************/
  542. Say "Press any key to continue."
  543. parse upper value SysGetKey('NOECHO') with key
  544.  
  545. Return
  546.  
  547. USAGE:
  548. /****************************************************************
  549. ** Help on switches
  550. *****************************************************************/
  551.    
  552.    SAY LocalGlobal.Program||" Modifies "||LocalGlobal.ConfigFile||" file"
  553.    SAY
  554.    SAY "            /"||global.iBrightMagenta||"H"||global.iNormal"                  ... This Screen of switches"||global.iNormal
  555.    SAY "            /"||global.iBrightMagenta||"?"||global.iNormal"                  ... This Screen of switches"||global.iNormal
  556.    SAY "            /"||global.iBrightMagenta||"FH"||global.iNormal"                 ... Help for File commands"||global.iNormal
  557.    SAY "            /"||global.iBrightMagenta||"F:"||global.iBrightGreen||"["||global.iBrightCyan||"filename"||global.iBrightGreen||"]"||global.iNormal"       ... contains file of commands"||global.iNormal
  558.    SAY "            /"||global.iBrightMagenta||"L:"||global.iBrightGreen||"["global.iBrightCyan||"directory;"||global.iBrightGreen||"]"||global.iNormal"     ... contains directories to add to LIBPATH"||global.iNormal
  559.    SAY "            /"||global.iBrightMagenta||"P:"||global.iBrightGreen||"["global.iBrightCyan||"directory;"||global.iBrightGreen||"]"||global.iNormal"     ... contains directories to add to PATH"||global.iNormal
  560.    SAY "            /"||global.iBrightMagenta||"D:"||global.iBrightGreen||"["global.iBrightCyan||"directory;"||global.iBrightGreen||"]"||global.iNormal"     ... contains directories to add to DPATH"||global.iNormal
  561.    SAY "      /"||global.iBrightMagenta||"LDELDIR:"||global.iBrightGreen||"["global.iBrightCyan||"directory;"||global.iBrightGreen||"]"||global.iNormal"     ... contains directories to delete from LIBPATH"||global.iNormal
  562.    SAY "      /"||global.iBrightMagenta||"PDELDIR:"||global.iBrightGreen||"["global.iBrightCyan||"directory;"||global.iBrightGreen||"]"||global.iNormal"     ... contains directories to delete from  PATH"||global.iNormal
  563.    SAY "      /"||global.iBrightMagenta||"DDELDIR:"||global.iBrightGreen||"["global.iBrightCyan||"directory;"||global.iBrightGreen||"]"||global.iNormal"     ... contains directories to delete from DPATH"||global.iNormal
  564.    SAY global.iBrightBlue||"............         "||global.ired||"(Must use ; after directory names!) "||global.inormal
  565.    SAY "            /"||global.iBrightMagenta||"B:"||global.iBrightGreen||"["global.iBrightCyan||LocalGlobal.ConfigFile||" line"||global.iBrightGreen||"]"||global.iNormal"    ... Complete "||LocalGlobal.ConfigFile||" Line"||global.iNormal
  566.    SAY global.iBrightBlue||"............         "||global.iBrightCyan||"(After File System is loaded... After IFS Statement) "||global.inormal
  567.    SAY "            /"||global.iBrightMagenta||"E:"||global.iBrightGreen||"["global.iBrightCyan||LocalGlobal.ConfigFile||" line"||global.iBrightGreen||"]"||global.iNormal"    ... Complete "||LocalGlobal.ConfigFile||" Line"||global.iNormal
  568.    SAY global.iBrightBlue||".............         "||global.iBrightCyan||"(Add to end of "||LocalGlobal.ConfigFile||" file) "||global.inormal
  569.    SAY "            /"||global.iBrightMagenta||"S:"||global.iBrightGreen||"["global.iBrightCyan||"Keyword"||global.iBrightGreen||"]"||global.iNormal||"="||global.iBrightGreen||"["global.iBrightCyan||"Value"||global.iBrightGreen||"]"||global.iNormal
  570.    SAY global.iBrightBlue||"............     "||global.iyellow||"Keyword"||global.inormal||":"||global.iBrightCyan||" Keyword for SET Statment "||global.inormal
  571.    SAY global.iBrightBlue||"............     "||global.iyellow||"Value"||global.inormal||":"||global.iBrightCyan||" Value to SET keyword "||global.inormal
  572.    SAY global.iBrightBlue||"............   "||global.ired||"(Must use ; if VALUE is directory names!) "||global.inormal
  573.    SAY global.iBrightBlue||"............   "||global.ired||"(Set Variable cannot have ""/"" for it's value "||global.inormal
  574.    SAY global.iBrightBlue||"............   "||global.ired||"           - Do through command file) "||global.inormal
  575.  
  576.    SAY
  577.  
  578.    CALL Pause
  579.    EXIT -1
  580.  
  581. FileUsage:
  582. /****************************************************************
  583. ** Help on File Commands.
  584. *****************************************************************/
  585.    
  586.    SAY LocalGlobal.Program||" Modifies "||LocalGlobal.ConfigFile||" file"
  587.    SAY "    : File Format"
  588.    SAY 
  589.    SAY "            "||global.iBrightMagenta||"--"||global.iNormal||"                  ... Comment Line"
  590.    SAY "       "||global.iBrightMagenta||"LIBPATH"||global.inormal||"="||global.iBrightGreen||"["global.iBrightCyan||"directory;"||global.iBrightGreen||"]"||global.iNormal
  591.    SAY "          "||global.iBrightMagenta||"PATH"||global.inormal||"="||global.iBrightGreen||"["global.iBrightCyan||"directory;"||global.iBrightGreen||"]"||global.iNormal
  592.    SAY "         "||global.iBrightMagenta||"DPATH"||global.inormal||"="||global.iBrightGreen||"["global.iBrightCyan||"directory;"||global.iBrightGreen||"]"||global.iNormal
  593.    SAY "    "||global.iBrightMagenta||"DELLIBPATH"||global.inormal||"="||global.iBrightGreen||"["global.iBrightCyan||"directory;"||global.iBrightGreen||"]"||global.iNormal
  594.    SAY "       "||global.iBrightMagenta||"DELPATH"||global.inormal||"="||global.iBrightGreen||"["global.iBrightCyan||"directory;"||global.iBrightGreen||"]"||global.iNormal
  595.    SAY "      "||global.iBrightMagenta||"DELDPATH"||global.inormal||"="||global.iBrightGreen||"["global.iBrightCyan||"directory;"||global.iBrightGreen||"]"||global.iNormal
  596.    SAY global.iBrightBlue||"......         "||global.ired||"(Must use ; after directory names!) "||global.inormal
  597.    SAY "      "||global.iBrightMagenta||"AddBegin"||global.inormal||"="||global.iBrightGreen||"["global.iBrightCyan||LocalGlobal.ConfigFile||" line"||global.iBrightGreen||"]"||global.iNormal
  598.    SAY global.iBrightBlue||"......         "||global.iBrightCyan||"(After File System is loaded... After IFS Statement) "||global.inormal
  599.    SAY "        "||global.iBrightMagenta||"AddEnd"||global.inormal||"="||global.iBrightGreen||"["global.iBrightCyan||LocalGlobal.ConfigFile||" line"||global.iBrightGreen||"]"||global.iNormal
  600.    SAY global.iBrightBlue||"......         "||global.iBrightCyan||"(Add to end of "||LocalGlobal.ConfigFile||" file) "||global.inormal
  601.    SAY "        "||global.iBrightMagenta||"SetVar"||global.inormal||"="||global.iBrightGreen||"["global.iBrightCyan||"Keyword"||global.iBrightGreen||"]"||global.iNormal||"="||global.iBrightGreen||"["global.iBrightCyan||"Value"||global.iBrightGreen||"]"||g
  602.    SAY global.iBrightBlue||"......         "||global.iyellow||"Keyword"||global.inormal||":"||global.iBrightCyan||" Keyword for SET Statment "||global.inormal
  603.    SAY global.iBrightBlue||"......         "||global.iyellow||"Value"||global.inormal||":"||global.iBrightCyan||" Value to SET keyword "||global.inormal
  604.    SAY global.iBrightBlue||"......         "||global.ired||"(Must use ; if VALUE is directory names!) "||global.inormal
  605.  
  606.    SAY
  607.    CALL Pause
  608.  
  609.    EXIT -1
  610.  
  611. HALT:
  612. /****************************************************************
  613. ** User stopped program! Shame on them!!
  614. *****************************************************************/
  615.    trace off
  616.    CALL STREAM filein, "C", "CLOSE"             /* make sure, file is closed */
  617.    SAY LocalGlobal.Program||" User interrupted program."
  618.    CALL Pause
  619.    EXIT -1
  620.  
  621. ERROR:        
  622. /****************************************************************
  623. ** Error of some sort occured!
  624. *****************************************************************/
  625.    trace off
  626.    myrc = RC
  627.    SAY LocalGlobal.Program||' error occurred !'
  628.    SAY
  629.  
  630.    SAY 'REXX error' myrc 'in line' SIGL':' ||global.iRedWhite||ERRORTEXT(myrc)||global.iNormal
  631.    SAY global.iBrightRed||Substr('     ',1,6-Length(SIGL))(SIGL)' *-*   'Sourceline(sigl)||global.iNormal
  632.  
  633. IF MYRC = 43 THEN do
  634.    SAY
  635.    SAY '    Chances are you are in not in the correct subdirectory.'
  636.    SAY '    This procedure MUST use some External Functions.'
  637.    SAY '    You MUST have the DLL''s or CMD files for these External Functions'
  638.    SAY '     in your LIBPATH or PATH.'
  639.    SAY '    (Since your are in OS/2 2.x then you should have "." in your LIBPATH'
  640.    SAY '    This would allow you to change to the directory with the DLL''s and run.)'
  641.    SAY
  642.    SAY global.iBrightCyan||'Internally: YOU MUST BE IN K:\PUBLIC\REXX.'Global.Normal
  643.    SAY
  644. end
  645. else do
  646.    SAY
  647.    SAY global.iBrightCyan||'Please contact the author with a description of the error.'||global.iNormal
  648. end
  649.    CALL Pause
  650.    EXIT -99
  651.  
  652.