GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: misc/xerprn.F Lines: 0 52 0.0 %
Date: 2023-06-30 12:56:34 Branches: 0 52 0.0 %

Line Branch Exec Source
1
*DECK XERPRN
2
      SUBROUTINE XERPRN (PREFIX, NPREF, MESSG, NWRAP)
3
      IMPLICIT NONE
4
C***BEGIN PROLOGUE  XERPRN
5
C***SUBSIDIARY
6
C***PURPOSE  Print error messages processed by XERMSG.
7
C***LIBRARY   SLATEC (XERROR)
8
C***CATEGORY  R3C
9
C***TYPE      ALL (XERPRN-A)
10
C***KEYWORDS  ERROR MESSAGES, PRINTING, XERROR
11
C***AUTHOR  Fong, Kirby, (NMFECC at LLNL)
12
C***DESCRIPTION
13
C
14
C This routine sends one or more lines to each of the (up to five)
15
C logical units to which error messages are to be sent.  This routine
16
C is called several times by XERMSG, sometimes with a single line to
17
C print and sometimes with a (potentially very long) message that may
18
C wrap around into multiple lines.
19
C
20
C PREFIX  Input argument of type CHARACTER.  This argument contains
21
C         characters to be put at the beginning of each line before
22
C         the body of the message.  No more than 16 characters of
23
C         PREFIX will be used.
24
C
25
C NPREF   Input argument of type INTEGER.  This argument is the number
26
C         of characters to use from PREFIX.  If it is negative, the
27
C         intrinsic function LEN is used to determine its length.  If
28
C         it is zero, PREFIX is not used.  If it exceeds 16 or if
29
C         LEN(PREFIX) exceeds 16, only the first 16 characters will be
30
C         used.  If NPREF is positive and the length of PREFIX is less
31
C         than NPREF, a copy of PREFIX extended with blanks to length
32
C         NPREF will be used.
33
C
34
C MESSG   Input argument of type CHARACTER.  This is the text of a
35
C         message to be printed.  If it is a long message, it will be
36
C         broken into pieces for printing on multiple lines.  Each line
37
C         will start with the appropriate prefix and be followed by a
38
C         piece of the message.  NWRAP is the number of characters per
39
C         piece; that is, after each NWRAP characters, we break and
40
C         start a new line.  In addition the characters '$$' embedded
41
C         in MESSG are a sentinel for a new line.  The counting of
42
C         characters up to NWRAP starts over for each new line.  The
43
C         value of NWRAP typically used by XERMSG is 72 since many
44
C         older error messages in the SLATEC Library are laid out to
45
C         rely on wrap-around every 72 characters.
46
C
47
C NWRAP   Input argument of type INTEGER.  This gives the maximum size
48
C         piece into which to break MESSG for printing on multiple
49
C         lines.  An embedded '$$' ends a line, and the count restarts
50
C         at the following character.  If a line break does not occur
51
C         on a blank (it would split a word) that word is moved to the
52
C         next line.  Values of NWRAP less than 16 will be treated as
53
C         16.  Values of NWRAP greater than 132 will be treated as 132.
54
C         The actual line length will be NPREF + NWRAP after NPREF has
55
C         been adjusted to fall between 0 and 16 and NWRAP has been
56
C         adjusted to fall between 16 and 132.
57
C
58
C***REFERENCES  R. E. Jones and D. K. Kahaner, XERROR, the SLATEC
59
C                 Error-handling Package, SAND82-0800, Sandia
60
C                 Laboratories, 1982.
61
C***ROUTINES CALLED  I1MACH, XGETUA
62
C***REVISION HISTORY  (YYMMDD)
63
C   880621  DATE WRITTEN
64
C   880708  REVISED AFTER THE SLATEC CML SUBCOMMITTEE MEETING OF
65
C           JUNE 29 AND 30 TO CHANGE THE NAME TO XERPRN AND TO REWORK
66
C           THE HANDLING OF THE NEW LINE SENTINEL TO BEHAVE LIKE THE
67
C           SLASH CHARACTER IN FORMAT STATEMENTS.
68
C   890706  REVISED WITH THE HELP OF FRED FRITSCH AND REG CLEMENS TO
69
C           STREAMLINE THE CODING AND FIX A BUG THAT CAUSED EXTRA BLANK
70
C           LINES TO BE PRINTED.
71
C   890721  REVISED TO ADD A NEW FEATURE.  A NEGATIVE VALUE OF NPREF
72
C           CAUSES LEN(PREFIX) TO BE USED AS THE LENGTH.
73
C   891013  REVISED TO CORRECT ERROR IN CALCULATING PREFIX LENGTH.
74
C   891214  Prologue converted to Version 4.0 format.  (WRB)
75
C   900510  Added code to break messages between words.  (RWC)
76
C   920501  Reformatted the REFERENCES section.  (WRB)
77
C***END PROLOGUE  XERPRN
78
      CHARACTER*(*) PREFIX, MESSG
79
      INTEGER NPREF, NWRAP
80
      CHARACTER*148 CBUFF
81
      INTEGER IU(5), NUNIT
82
      CHARACTER*2 NEWLIN
83
      PARAMETER (NEWLIN = '$$')
84
      INTEGER N, I1MACH, I, LPREF, LWRAP, LENMSG, NEXTC
85
      INTEGER LPIECE, IDELTA
86
C***FIRST EXECUTABLE STATEMENT  XERPRN
87
      CALL XGETUA(IU,NUNIT)
88
C
89
C       A ZERO VALUE FOR A LOGICAL UNIT NUMBER MEANS TO USE THE STANDARD
90
C       ERROR MESSAGE UNIT INSTEAD.  I1MACH(4) RETRIEVES THE STANDARD
91
C       ERROR MESSAGE UNIT.
92
C
93
      N = I1MACH(4)
94
      DO 10 I=1,NUNIT
95
         IF (IU(I) .EQ. 0) IU(I) = N
96
   10 CONTINUE
97
C
98
C       LPREF IS THE LENGTH OF THE PREFIX.  THE PREFIX IS PLACED AT THE
99
C       BEGINNING OF CBUFF, THE CHARACTER BUFFER, AND KEPT THERE DURING
100
C       THE REST OF THIS ROUTINE.
101
C
102
      IF ( NPREF .LT. 0 ) THEN
103
         LPREF = LEN(PREFIX)
104
      ELSE
105
         LPREF = NPREF
106
      ENDIF
107
      LPREF = MIN(16, LPREF)
108
      IF (LPREF .NE. 0) CBUFF(1:LPREF) = PREFIX
109
C
110
C       LWRAP IS THE MAXIMUM NUMBER OF CHARACTERS WE WANT TO TAKE AT ONE
111
C       TIME FROM MESSG TO PRINT ON ONE LINE.
112
C
113
      LWRAP = MAX(16, MIN(132, NWRAP))
114
C
115
C       SET LENMSG TO THE LENGTH OF MESSG, IGNORE ANY TRAILING BLANKS.
116
C
117
      LENMSG = LEN(MESSG)
118
      N = LENMSG
119
      DO 20 I=1,N
120
         IF (MESSG(LENMSG:LENMSG) .NE. ' ') GO TO 30
121
         LENMSG = LENMSG - 1
122
   20 CONTINUE
123
   30 CONTINUE
124
C
125
C       IF THE MESSAGE IS ALL BLANKS, THEN PRINT ONE BLANK LINE.
126
C
127
      IF (LENMSG .EQ. 0) THEN
128
         CBUFF(LPREF+1:LPREF+1) = ' '
129
         DO 40 I=1,NUNIT
130
            WRITE(IU(I), '(A)') CBUFF(1:LPREF+1)
131
   40    CONTINUE
132
         RETURN
133
      ENDIF
134
C
135
C       SET NEXTC TO THE POSITION IN MESSG WHERE THE NEXT SUBSTRING
136
C       STARTS.  FROM THIS POSITION WE SCAN FOR THE NEW LINE SENTINEL.
137
C       WHEN NEXTC EXCEEDS LENMSG, THERE IS NO MORE TO PRINT.
138
C       WE LOOP BACK TO LABEL 50 UNTIL ALL PIECES HAVE BEEN PRINTED.
139
C
140
C       WE LOOK FOR THE NEXT OCCURRENCE OF THE NEW LINE SENTINEL.  THE
141
C       INDEX INTRINSIC FUNCTION RETURNS ZERO IF THERE IS NO OCCURRENCE
142
C       OR IF THE LENGTH OF THE FIRST ARGUMENT IS LESS THAN THE LENGTH
143
C       OF THE SECOND ARGUMENT.
144
C
145
C       THERE ARE SEVERAL CASES WHICH SHOULD BE CHECKED FOR IN THE
146
C       FOLLOWING ORDER.  WE ARE ATTEMPTING TO SET LPIECE TO THE NUMBER
147
C       OF CHARACTERS THAT SHOULD BE TAKEN FROM MESSG STARTING AT
148
C       POSITION NEXTC.
149
C
150
C       LPIECE .EQ. 0   THE NEW LINE SENTINEL DOES NOT OCCUR IN THE
151
C                       REMAINDER OF THE CHARACTER STRING.  LPIECE
152
C                       SHOULD BE SET TO LWRAP OR LENMSG+1-NEXTC,
153
C                       WHICHEVER IS LESS.
154
C
155
C       LPIECE .EQ. 1   THE NEW LINE SENTINEL STARTS AT MESSG(NEXTC:
156
C                       NEXTC).  LPIECE IS EFFECTIVELY ZERO, AND WE
157
C                       PRINT NOTHING TO AVOID PRODUCING UNNECESSARY
158
C                       BLANK LINES.  THIS TAKES CARE OF THE SITUATION
159
C                       WHERE THE LIBRARY ROUTINE HAS A MESSAGE OF
160
C                       EXACTLY 72 CHARACTERS FOLLOWED BY A NEW LINE
161
C                       SENTINEL FOLLOWED BY MORE CHARACTERS.  NEXTC
162
C                       SHOULD BE INCREMENTED BY 2.
163
C
164
C       LPIECE .GT. LWRAP+1  REDUCE LPIECE TO LWRAP.
165
C
166
C       ELSE            THIS LAST CASE MEANS 2 .LE. LPIECE .LE. LWRAP+1
167
C                       RESET LPIECE = LPIECE-1.  NOTE THAT THIS
168
C                       PROPERLY HANDLES THE END CASE WHERE LPIECE .EQ.
169
C                       LWRAP+1.  THAT IS, THE SENTINEL FALLS EXACTLY
170
C                       AT THE END OF A LINE.
171
C
172
      NEXTC = 1
173
   50 LPIECE = INDEX(MESSG(NEXTC:LENMSG), NEWLIN)
174
      IF (LPIECE .EQ. 0) THEN
175
C
176
C       THERE WAS NO NEW LINE SENTINEL FOUND.
177
C
178
         IDELTA = 0
179
         LPIECE = MIN(LWRAP, LENMSG+1-NEXTC)
180
         IF (LPIECE .LT. LENMSG+1-NEXTC) THEN
181
            DO 52 I=LPIECE+1,2,-1
182
               IF (MESSG(NEXTC+I-1:NEXTC+I-1) .EQ. ' ') THEN
183
                  LPIECE = I-1
184
                  IDELTA = 1
185
                  GOTO 54
186
               ENDIF
187
   52       CONTINUE
188
         ENDIF
189
   54    CBUFF(LPREF+1:LPREF+LPIECE) = MESSG(NEXTC:NEXTC+LPIECE-1)
190
         NEXTC = NEXTC + LPIECE + IDELTA
191
      ELSEIF (LPIECE .EQ. 1) THEN
192
C
193
C       WE HAVE A NEW LINE SENTINEL AT MESSG(NEXTC:NEXTC+1).
194
C       DON'T PRINT A BLANK LINE.
195
C
196
         NEXTC = NEXTC + 2
197
         GO TO 50
198
      ELSEIF (LPIECE .GT. LWRAP+1) THEN
199
C
200
C       LPIECE SHOULD BE SET DOWN TO LWRAP.
201
C
202
         IDELTA = 0
203
         LPIECE = LWRAP
204
         DO 56 I=LPIECE+1,2,-1
205
            IF (MESSG(NEXTC+I-1:NEXTC+I-1) .EQ. ' ') THEN
206
               LPIECE = I-1
207
               IDELTA = 1
208
               GOTO 58
209
            ENDIF
210
   56    CONTINUE
211
   58    CBUFF(LPREF+1:LPREF+LPIECE) = MESSG(NEXTC:NEXTC+LPIECE-1)
212
         NEXTC = NEXTC + LPIECE + IDELTA
213
      ELSE
214
C
215
C       IF WE ARRIVE HERE, IT MEANS 2 .LE. LPIECE .LE. LWRAP+1.
216
C       WE SHOULD DECREMENT LPIECE BY ONE.
217
C
218
         LPIECE = LPIECE - 1
219
         CBUFF(LPREF+1:LPREF+LPIECE) = MESSG(NEXTC:NEXTC+LPIECE-1)
220
         NEXTC  = NEXTC + LPIECE + 2
221
      ENDIF
222
C
223
C       PRINT
224
C
225
      DO 60 I=1,NUNIT
226
         WRITE(IU(I), '(A)') CBUFF(1:LPREF+LPIECE)
227
   60 CONTINUE
228
C
229
      IF (NEXTC .LE. LENMSG) GO TO 50
230
      RETURN
231
      END