/* EditTextFile.rexx v1.1 by Jeremy Friesner An ARexx script to cleanly modify text config lines. Any line beginning with sReplaceMe in the File fModifyMe will be replaced with the line sWithMe. If no such thing as sReplaceMe is found in the file, then sWithMe will be added to the end of the file. This script should never lose the original file: the first thing it does it rename the file to filename.bak and then reconstructs the modified version at the original file name by reading the .bak file. If an error occurs, it will restore filename.bak back to the original filename. Any ^ signs in the sReplaceMe or sWithMe args will be turned into space characters. (Although sReplaceMe doesn't actually need these, because it's the last arg and thus spaces will be included in it anyway. Isn't Rexx argument passing fun?) */ parse arg fModifyMe sReplaceMe sWithMe address COMMAND sReplaceMe = ChangeToSpaces(sReplaceMe) sWithMe = strip(ChangeToSpaces(sWithMe)) fBackupFile = fModifyMe || ".bak" say "File to be modified = [" || fModifyMe || "]" say "Backup file = [" || fBackupFile || "]" say "String to add/replace = [" || sReplaceMe || "]" say "add/Replace with = [" || sWithMe || "]" keylength = length(sReplaceMe) /* First, make sure rexxsupport.library is available. */ call addlib("rexxsupport.library", 0, -30, 0) /* Delete any .bak file that now exists */ call delete(fBackupFile) /* Rename the original filename to filename.bak */ if (rename(fModifyMe, fBackupFile) == 0) then do say "Error: Couldn't rename " || fModifyMe || " to " || fBackupFile exit(30) end BFileRenamed = 1 /* Default == haven't found the line we want to replace yet */ BFoundOurLine = 0 /* Open the backup file for reading */ if (open('oldfile',fBackupFile,'R') == 0) then do say "Couldn't open backup file " || fBackupFile call error end /* and the new file for writing */ if (open('newfile',fModifyMe,'W') == 0) then do say "Couldn't open output file " || fModifyMe call error end /* Scan the old file, writing the new one */ do while (EOF('oldfile') == 0) nextline = readln('oldfile') sCheckPart = left(nextline,keylength) if ((BFoundOurLine == 0)&(sCheckPart = sReplaceMe)) then do /* don't write out this line... write out our substitute instead! */ say "Found: [" || nextline || "] replacing with [" || sWithMe || "]" call writeln('newfile',sWithMe) BFoundOurLine = 1 end else do call writeln('newfile',nextline) end end /* If we never found our line to replace, then just add our line at the end of the file. */ if (BFoundOurLine == 0) then call writeln('newfile',sWithMe) call close('oldfile') call close('newfile') /* success! */ successMessage = "File " || fModifyMe || " successfully modified (" || sReplaceMe || ") -> " || "(" || sWithMe || ")." say successMessage /* Show calling app that we succeeded */ address COMMAND 'echo ' || successMessage || ' >t:edit_text_succeeded' exit(0) /* Changes all occurrences of the character '^' to spaces in the string. Needed to get around ARexx's lame argument parsing. I think. */ ChangeToSpaces: procedure parse arg sOrig sNew = "" do while (length(sOrig) > 0) cChar = left(sOrig,1) if (cChar == "^") then cChar = " " sNew = sNew || cChar sOrig = right(sOrig,length(sOrig)-1) end return sNew /* Replaces original file if an error occurs */ error: say "An error occured!" call close('oldfile') call close('newfile') if (BFileRenamed == 1) then do say "Attempting to restore the original file " || fModifyMe /* Delete the incomplete file that now exists */ call rename(fModifyMe, fModifyMe || ".tobedeleted") /* Rename filename.bak back to filename */ if (rename(fBackupFile, fModifyMe) == 0) then do call rename(fModifyMe || ".tobedeleted", fModifyMe) say "Error: Couldn't rename " || fBackupFile || " to " || fModifyMe || ", aborting now." exit(30) end call delete(fModifyMe||".tobedeleted") say "Recovery of original file " || fModifyMe || " was successful." end exit(30)