SUBROUTINE STRIP_LSM(UNIT_IN, UNIT_OUT, UPDT_PRC, UPDT_PTC, & UPDT_GEOM, OK) C---------------------------------------------------------------------- C- C- Purpose and Methods : Scan the input LSM file, stripping out the selected C- sections, and copying the rest verbatim to the output file. C- C- Inputs : UNIT_IN The unit number of the input file C- UNIT_OUT The unit number of the output file C- UPDT_PRC Logical to tell if to strip out the section C- PROM_OUTPUT_CUT C- UPDT_PTC tell if to strip out the section PROM_TRANSFER_COEFF C- UPDT_GEOM tell if to strip out the sections dealing with the C- tower geometry. C- C- Outputs : OK .TRUE. if no errors C- C- Controls: none C- C- Created 27-AUG-1990 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE C---------------------------------------------------------------------- C C Global declarations C INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.PARAMS' INCLUDE 'LSMP$SOURCE:PARSE_TOKENS.INC' INTEGER TRULEN EXTERNAL TRULEN C C Argument Declarations C INTEGER UNIT_IN, UNIT_OUT LOGICAL UPDT_PRC, UPDT_PTC, UPDT_GEOM LOGICAL OK C C Local variables C CHARACTER*133 LINE_BUFFER INTEGER START, END, LENGTH, END2 CHARACTER*133 WORD_BUFFER INTEGER STATE INTEGER OUTSIDE, COPYING, SKIPPING, END_COPY, END_SKIP PARAMETER (OUTSIDE = 1, COPYING = 2, SKIPPING = 3, END_COPY = 4, & END_SKIP = 5) C C Initialize a few things C CALL INIT_STRINGS() STATE = OUTSIDE OK = .TRUE. C C Loop once for every line, looking for either SECTION or END_SECTION, C depending on the current state. C DO WHILE (.TRUE.) IF ( (STATE .EQ. END_COPY) .OR. (STATE .EQ. END_SKIP)) THEN STATE = OUTSIDE ENDIF C READ ( UNIT_IN, 20, END = 200, ERR = 300 ) & LINE_BUFFER 20 FORMAT (A) LINE_BUFFER (133:133) = ' ' CALL WORD(LINE_BUFFER, START, END, LENGTH) IF (LENGTH .GT. 0) THEN WORD_BUFFER = LINE_BUFFER(START:END) CALL UPCASE(WORD_BUFFER, WORD_BUFFER) C IF (STATE .EQ. OUTSIDE) THEN C Check for SECTION IF (WORD_BUFFER(1:LENGTH) .EQ. TOKEN_STRING(T_SECTION)) THEN CALL WORD(LINE_BUFFER(END+1:133), START, END2, LENGTH) IF (LENGTH .GT. 0) THEN C Find out which section WORD_BUFFER = LINE_BUFFER(END+START:END+END2) CALL UPCASE(WORD_BUFFER, WORD_BUFFER) IF (UPDT_PRC .AND. (WORD_BUFFER .EQ. & TOKEN_STRING(T_PROM_OUTPUT_CUT))) THEN STATE = SKIPPING ELSEIF (UPDT_PTC .AND. (WORD_BUFFER .EQ. & TOKEN_STRING(T_PROM_TRANSFER_COEFF))) THEN STATE = SKIPPING ELSEIF (UPDT_GEOM .AND. ((WORD_BUFFER .EQ. & TOKEN_STRING(T_TOWER_GEOMETRY_R)) .OR. & (WORD_BUFFER .EQ. TOKEN_STRING(T_TOWER_GEOMETRY_Z)) & .OR. (WORD_BUFFER .EQ. & TOKEN_STRING(T_TOWER_GEOMETRY_PHI)) ) ) THEN STATE = SKIPPING ELSE STATE = COPYING ENDIF ENDIF ENDIF C C Check for END_SECTION C ELSEIF (WORD_BUFFER(1:LENGTH) .EQ. & TOKEN_STRING(T_END_SECTION)) THEN IF (STATE .EQ. SKIPPING) THEN STATE = END_SKIP ELSE STATE = END_COPY ENDIF ENDIF ENDIF C C Copy the line if indicated C IF ((STATE .EQ. OUTSIDE) .OR. (STATE .EQ. COPYING) .OR. & (STATE .EQ. END_COPY)) THEN C Fortran likes to put an extra space at the beginning of a line when it C is written, but doesn't take the space off when it is read. Therefore C copying input to output several times adds several spaces to the C beginning of each line. Since there must be a limit on the length of C the line, spaces can't be added. The way this program gets around it is C to not output carriage control characters. The full lines may be viewed C in EVE, but not TYPEd or PRINTed. WRITE (UNIT_OUT, 30) LINE_BUFFER(1:TRULEN(LINE_BUFFER)) 30 FORMAT( A ) ENDIF END DO C 300 CONTINUE OK = .FALSE. 200 CONTINUE 999 RETURN END