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