SUBROUTINE FILEXT (OLDFIL,NEWFIL, 2 EXT,ERRCD) c c FUNCTION: cf cf FILEXT takes a file specification (OLDFIL) which cf may not have an extension, checks to see if the extension cf exists, and if not, adds the extension supplied as the default cf value (EXT). The result is placed in NEWFIL. If the resulting cf length would be greater than the length of the receiving area cf (NEWFIL), the ERRCD is set to 4. The length cf of the original OLDFIL is also checked; if it is zero, cf then ERRCD is set to 2. ERRCD is set to zero for cf normal return. cf c USAGE: cu cu The subroutine FILEXT is used to provide a default value cu for a file specification. The user supplies the original file cu specification (OLDFIL), a default extension (EXT), and cu a character string storage area for the result (NEWFIL). cu The subroutine returns an error code (ERRCD), which is non-zero cu if the original string has length zero (value 2), or if the cu resulting file specification will not fit in the area provided cu (value 4). cu cu The subroutine is called as: cu cu CALL FILEXT (OLDFIL,NEWFIL,EXT,ERRCD) cu c INPUTS: ci ci OLDFIL = character variable containing the original ci file specification. ci ci EXT = character variable containing the default ci extension to be used, with the period ('.'). ci No blanks may exist in this string. For ci example, EXT = '.SYS'. ci c OUTPUTS: co co NEWFIL = character variable to contain the final file co specification. co co ERRCD = integer variable indicating any errors which co occured during processing. A value of co zero indicates successful completion. co co ERRCD : 2 : the original file specification co contained no non-blank characters. co co ERRCD : 4 : the resulting file specification co would not fit in the variable NEWFIL. co c ALGORITHM: ca ca NONE ca c MACHINE DEPENDENCIES: cm cm Other than the basic assumption of file extensions, cm there are no machine dependencies. cm c HISTORY: ch ch written by: J. Douglas Birdwell ch date: November 12, 1984 ch current version: 1.0 ch modifications: 8-aug=96:bb:modified ch routine to eliminate ch machine dependencies. ch c ROUTINES CALLED: cc cc NONE cc c COMMON MEMORY USED: cm cm NONE cm c---------------------------------------------------------------------- c written for: The CASCADE Project c Oak Ridge National Laboratory c U.S. Department of Energy c contract number DE-AC05-840R21400 c subcontract number 37B-7685 S13 c organization: The University of Tennessee c---------------------------------------------------------------------- c THIS SOFTWARE IS IN THE PUBLIC DOMAIN c NO RESTRICTIONS ON ITS USE ARE IMPLIED c---------------------------------------------------------------------- c c GLOBAL VARIABLES: C CHARACTER*(*) OLDFIL CHARACTER*(*) NEWFIL CHARACTER*(*) EXT INTEGER ERRCD C C LOCAL VARIABLES: C CHARACTER*20 VERSN CHARACTER*1 CHAR INTEGER LNOFIL INTEGER LNNFIL INTEGER LENEXT INTEGER FNBLNK INTEGER LENGTH INTEGER SLLES1 C C CODE: C C--FIND LENGTHS OF THE VARIOUS STRINGS C LNOFIL = LEN(OLDFIL) LNNFIL = LEN(NEWFIL) LENEXT = LEN(EXT) C C--FIND THE LAST NON-BLANK CHARACTER C FNBLNK = LNOFIL 10 IF ((OLDFIL(FNBLNK:FNBLNK) .EQ. ' ') 2 .AND. (FNBLNK .GT. 0)) THEN FNBLNK = FNBLNK - 1 GO TO 10 END IF C C--IF THERE ARE NO NON-BLANK CHARACTERS, SIGNAL ERROR CODE 2 C IF (FNBLNK .EQ. 0) THEN ERRCD = 2 RETURN END IF C C--GO BACKWARD THROUGH STRING C DO 20, I = FNBLNK, 1, -1 CHAR = OLDFIL(I:I) IF ((CHAR .EQ. ':') 2 .OR. (CHAR .EQ. ']') 3 .OR. (I .EQ. 1)) THEN NEWFIL = OLDFIL(1:FNBLNK)//EXT C C--CHECK LENGTH C LENGTH = FNBLNK + LENEXT IF (LENGTH .GT. LNNFIL) THEN ERRCD = 4 RETURN ELSE ERRCD = 0 RETURN END IF ELSE IF (CHAR .EQ. '.') THEN NEWFIL = OLDFIL(1:FNBLNK) C C--CHECK LENGTH C LENGTH = FNBLNK IF (LENGTH .GT. LNNFIL) THEN ERRCD = 4 RETURN ELSE ERRCD = 0 RETURN END IF ELSE IF (CHAR .EQ. ';') THEN VERSN = OLDFIL(I:FNBLNK) SLLES1 = I - 1 DO 30, J = SLLES1, 1, -1 CHAR = OLDFIL(J:J) IF (CHAR .EQ. '.') THEN NEWFIL = OLDFIL(1:FNBLNK) C C--CHECK LENGTH C LENGTH = FNBLNK IF (LENGTH .GT. LNNFIL) THEN ERRCD = 4 RETURN ELSE ERRCD = 0 RETURN END IF ELSE IF ((CHAR .EQ. ':') 2 .OR. (CHAR .EQ. ']') 3 .OR. (J .EQ. 1)) THEN NEWFIL = OLDFIL(1:SLLES1)//EXT// 2 OLDFIL(I:FNBLNK) C C--CHECK LENGTH C LENGTH = FNBLNK + LENEXT IF (LENGTH .GT. LNNFIL) THEN ERRCD = 4 RETURN ELSE ERRCD = 0 RETURN END IF END IF 30 CONTINUE END IF 20 CONTINUE C C--IT'S NOT SUPPOSED TO GET HERE C ERRCD = 8 RETURN END