/* ------------------------------------------------------------------ */ /* Based on source code from John Wunderlin (see EMail Addresses) */ /* ------------------------------------------------------------------ */ /* function: Read a file using CharIn() and split it into lines by */ /* hand */ /* */ /* call: rxReadStem = stem_for_the_lines */ /* call RxReadTextFile fileName {, lineSep } */ /* */ /* where: rxReadStem - name of the stem for the file contents */ /* The name MUST end with a dot! */ /* fileName - name of the file to read */ /* LineSep - line separator chars */ /* (def.: "0D0A"x) */ /* */ /* returns: */ /* 0 -> ok */ /* 1 -> parameter missing */ /* 2 -> file not found */ /* 3 -> variable referenced in RxReadStem is invalid */ /* 4 -> NOTREADY condition occured */ /* 5 -> ERROR condition occured */ /* 6 -> FAILURE condition occured */ /* 7 -> unexpected condition occured */ /* */ /* example: To read the file \CONFIG.SYS into the stem 'CONFIG.' use */ /* */ /* rxReadStem = 'CONFIG.' */ /* CONFIG.0 = 0 */ /* thisRC = RxReadTextFile( '\CONFIG.SYS' ) */ /* */ /* History */ /* RXTT32: Corrected a bug in the handling of the result var */ /* Added code to handle empty files correct */ /* Added code for more return codes */ /* */ /* */ /* */ RxReadTextFile: PROCEDURE expose (RxReadStem) (exposeList) /* install local error handlers */ SIGNAL ON NOTREADY Name RxReadTextFileError SIGNAL ON ERROR Name RxReadTextFileError SIGNAL ON FAILURE Name RxReadTextFileError /* init the return code */ thisRC = 3 /* check the name of the variable for the */ /* result */ if symbol( rxReadStem || 0 ) = 'VAR' & right( rxReadStem,1 ) = '.' then do /* get the parameter */ parse arg fileName , lineSep /* remove leading and trailing blanks from the */ /* parameter */ fileName = strip( fileName ) lineSep = strip( lineSep ) /* use default line separator if necessary */ if lineSep = "" then lineSep = d2c(13) || d2c(10) /* set the return code */ thisRC = 1 /* init the stem with the lines of the file */ interpret drop rxReadStem call value rxReadStem || '0', 0 if fileName <> "" then do if stream( fileName, "c", "QUERY EXISTS" ) <> "" then do if stream( fileName, "c", "QUERY SIZE" ) <> 0 then do /* open the file v3.20 */ call stream fileName, "c", "OPEN READ" /* read the complete file using Charin() v3.20 */ fileContents = charIN( fileName, 1, chars( fileName ) ) /* close the file v3.20 */ call stream fileName, "c", "CLOSE" end /* if */ else fileContents = "" /* close the file */ call stream fileName, "c", "CLOSE" /* split the file into lines by hand */ startpos = 1 do lineCount = 1 by 1 /* search the end of the current line */ curpos = pos( lineSep,filecontents,startpos ) if curpos = 0 then leave lineCount lineLen = ( curpos - startpos ) /* save the line in the stem */ call value rxReadStem || LineCount , , substr( fileContents,startpos,linelen ) startpos = curpos + length( lineSep ) end lineCount /* save the no. of lines */ call value rxReadStem || '0' , lineCount -1 /* set the return code */ thisRC = 0 end /* if stream( ... */ end /* if filename <> "" then */ end /* if */ RETURN thisRC /* error exit for RxReadTextFile */ RxReadTextFileError: /* turn off the condition that caused the error */ INTERPRET 'SIGNAL OFF ' condition( 'C' ) curCondition = condition('C') select when curCondition = 'NOTREADY' then thisRC = 4 when curCondition = 'ERROR' then thisRC = 5 when curCondition = 'FAILURE' then thisRC = 6 otherwise thisRC = 7 end /* select */ /* close the file */ call stream fileName, 'c', 'CLOSE' return thisRC