SUBROUTINE INTTOSTR(VALUE, STRING, LENGTH) C---------------------------------------------------------------------- C- C- Purpose and Methods : Convert an integer to a string, using at least C- LENGTH digits. Use no leading zeros if LENGTH is 0. If the string will C- overflow the length of STRING, then fill the string with asterisks. C- If given VALUE = 0 and LENGTH = 0, it C- still puts a length 1 string into STRING ( '0' ). If the value is too C- large for the string, a second attempt to format it will be made by C- dividing the value by 1000 and appending a 'k' onto the end of the C- formatted string (i.e. print the value in kilos). C- C- Inputs : VALUE the integer to be translated C- Outputs : STRING the string to fill C- Controls: LENGTH the minimum length of the integer C- C- Created 4-MAR-1991 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE INTEGER VALUE CHARACTER*(*) STRING INTEGER LENGTH C INTEGER ILENGTH INTEGER SLENGTH INTEGER COUNT C ILENGTH = LENGTH SLENGTH = LEN(STRING) IF (LENGTH .LT. 1) ILENGTH = 1 C CALL OTS$CVT_L_TI(VALUE, STRING, %VAL(LENGTH),, ) IF (STRING(1:1) .NE. '*') GOTO 999 C C Do Kilos C IF ((LENGTH .NE. 1) .OR. (SLENGTH .EQ. 1)) GOTO 999 CALL BUILD_REAL_STRING(FLOAT(VALUE) / 1000., & 3, STRING(1:SLENGTH-1)) IF (STRING(1:1) .NE. '*') THEN C C Fix so doesn't produce things like '142.k' C IF (STRING(SLENGTH-1:SLENGTH-1) .EQ. '.') THEN DO COUNT = SLENGTH -2, 1, -1 STRING(COUNT+1:COUNT+1) = STRING(COUNT:COUNT) END DO STRING(1:1) = ' ' ENDIF STRING(SLENGTH:SLENGTH) = 'k' GOTO 999 ENDIF C C Do Errors C CALL STR$DUPL_CHAR(STRING, LEN(STRING), ICHAR('*')) C---------------------------------------------------------------------- 999 RETURN END C C C FUNCTION MON_INTLEN(NUMBER) C---------------------------------------------------------------------- C- C- Purpose and Methods : Returns the number of digits in NUMBER. C- NOTE: This routine only works with positive numbers. C- C- Returned value : The number of decimal digits in NUMBER C- Inputs : NUMBER the value in question C- Outputs : none C- Controls: none C- C- Created 5-APR-1991 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE INTEGER MON_INTLEN INTEGER NUMBER INTEGER COUNT, TEMP_VALUE C COUNT = 0 TEMP_VALUE = NUMBER DO WHILE (.TRUE.) TEMP_VALUE = TEMP_VALUE / 10 COUNT = COUNT + 1 IF (TEMP_VALUE .LT. 1) GOTO 999 END DO C---------------------------------------------------------------------- 999 CONTINUE MON_INTLEN = COUNT RETURN END C C C SUBROUTINE BUILD_REAL_STRING(VALUE, MAX_PRECISION, BUFFER) C---------------------------------------------------------------------- C- C- Purpose and Methods : This routine converts a REAL variable to a string, C- retaining as much precision as possible given the length of the C- string, up to MAX_PRECISION digits after the decimal point. C- C- Inputs : VALUE The value to convert C- MAX_PRECISION The maximum number of digits after the decimal C- point. C- Outputs : BUFFER The string to store it in. C- Controls: none C- C- Created 9-APR-1991 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE REAL VALUE INTEGER MAX_PRECISION CHARACTER*(*) BUFFER C INTEGER MON_INTLEN EXTERNAL MON_INTLEN C INTEGER SLENGTH INTEGER IVALUE REAL RVALUE INTEGER ILENGTH INTEGER DLENGTH LOGICAL NEGATIVE INTEGER COUNT, COUNT2 INTEGER SHIFT LOGICAL PERIOD C SLENGTH = LEN(BUFFER) IF (VALUE .LT. 0) THEN NEGATIVE = .TRUE. RVALUE = -VALUE ELSE NEGATIVE = .FALSE. RVALUE = VALUE ENDIF C PERIOD = .TRUE. C IF (RVALUE .GE. 10.0**9) GOTO 200 IF (MAX_PRECISION .LT. 0) GOTO 200 IF (MAX_PRECISION .GE. 9) GOTO 200 IF (RVALUE .LT. 1) RVALUE = 1 DO COUNT = MAX_PRECISION, 0, -1 IF (RVALUE .GE. 10.0**(9-COUNT)) GOTO 50 IF (NEGATIVE) THEN IF (MON_INTLEN(MAX(NINT(RVALUE * 10**COUNT), 1)) & .LE. SLENGTH-2) GOTO 100 ELSE IF (MON_INTLEN(MAX(NINT(RVALUE * 10**COUNT), 1)) & .LE. SLENGTH-1) GOTO 100 ENDIF 50 CONTINUE ENDDO C IF (NEGATIVE) THEN IF (MON_INTLEN(MAX(NINT(RVALUE),1)) .GT. SLENGTH-1) GOTO 200 ELSE IF (MON_INTLEN(MAX(NINT(RVALUE),1)) .GT. SLENGTH) GOTO 200 ENDIF C PERIOD = .FALSE. COUNT = 0 C C Build the string 100 CONTINUE IF (PERIOD) THEN CALL OTS$CVT_L_TI( NINT(VALUE * 10**COUNT), & BUFFER(1:SLENGTH-1), %VAL(MAX(COUNT+1,1)),, ) IF (BUFFER(1:1) .EQ. '*') GOTO 200 C IF (COUNT .NE. 0) THEN DO COUNT2 = SLENGTH, SLENGTH - COUNT + 1, -1 BUFFER(COUNT2:COUNT2) = BUFFER(COUNT2-1:COUNT2-1) END DO ENDIF BUFFER(SLENGTH-COUNT:SLENGTH-COUNT) = '.' ELSE CALL OTS$CVT_L_TI( NINT(VALUE), BUFFER(1:SLENGTH), & %VAL(1),, ) IF (BUFFER(1:1) .EQ. '*') GOTO 200 ENDIF GOTO 999 C C Handle Error C 200 CONTINUE CALL STR$DUPL_CHAR(BUFFER, SLENGTH, ICHAR('*')) IF (VALUE .LT. 0) BUFFER(1:1) = '-' C---------------------------------------------------------------------- 999 RETURN END