1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
//
// GENERATED FILE
//
use super::*;
use crate::SpiceContext;
use f2rust_std::*;
/// Set Error Status
///
/// Set the SPICELIB error status. DO NOT CALL THIS ROUTINE.
///
/// # Required Reading
///
/// * [ERROR](crate::required_reading::error)
///
/// # Brief I/O
///
/// ```text
/// VARIABLE I/O DESCRIPTION
/// -------- --- --------------------------------------------------
/// STATUS I Status indicator.
///
/// The function takes an UNSPECIFIED (and meaningless) value
/// on exit.
/// ```
///
/// # Detailed Input
///
/// ```text
/// STATUS is a flag that provides the new status. When .TRUE., it
/// means that an error condition exists.
/// ```
///
/// # Detailed Output
///
/// ```text
/// None.
///
/// This purpose of this routine is to set status; the
/// function takes an UNSPECIFIED value on exit. The
/// assigned value does not have any meaning.
/// ```
///
/// # Exceptions
///
/// ```text
/// Error free.
/// ```
///
/// # Particulars
///
/// ```text
/// DO NOT CALL THIS ROUTINE.
///
/// This is a data structure access routine for the
/// SPICELIB status. This routine should be used for no
/// other purpose; in particular, it should not be used
/// to signal errors. Use SIGERR or FAILED for that.
///
/// This routine assigns a value to SETERR on exit.
/// However, the value is not meaningful.
/// ```
///
/// # Examples
///
/// ```text
/// None. DON'T CALL THIS ROUTINE.
///
/// No examples. If you don't know EXACTLY what a
/// ``data structure access routine'' is, don't call
/// this routine. If you do know, you don't need an
/// example.
/// ```
///
/// # Restrictions
///
/// ```text
/// 1) DON'T CALL THIS ROUTINE.
/// ```
///
/// # Author and Institution
///
/// ```text
/// N.J. Bachman (JPL)
/// J. Diaz del Rio (ODC Space)
/// W.L. Taber (JPL)
/// ```
///
/// # Version
///
/// ```text
/// - SPICELIB Version 1.1.0, 26-OCT-2021 (JDR) (NJB)
///
/// Added IMPLICIT NONE statement.
///
/// Edited the header to comply with NAIF standard.
///
/// - SPICELIB Version 1.0.1, 10-MAR-1992 (WLT)
///
/// Comment section for permuted index source lines was added
/// following the header.
///
/// - SPICELIB Version 1.0.0, 31-JAN-1990 (NJB)
/// ```
///
/// # Revisions
///
/// ```text
/// - Beta Version 1.0.1, 08-FEB-1989 (NJB)
///
/// Warnings added to discourage use of this routine in
/// non-error-handling code.
/// ```
pub fn seterr(ctx: &mut SpiceContext, status: bool) -> bool {
let ret = SETERR(status, ctx.raw_context());
ret
}
//$Procedure SETERR ( Set Error Status )
pub fn SETERR(STATUS: bool, ctx: &mut Context) -> bool {
let mut SETERR: bool = false;
//
// Declaration of the entry point, FAILED:
//
//
// Executable Code:
//
// [f2rust] HACK: FAILED is called extremely frequently, and our
// standard implementation of SAVE variables (using a hashmap) has
// a noticeable performance cost, so we have some intrinsics
// specifically to optimise this case.
ctx.set_spice_failed(STATUS);
//
// Give SETERR a value; the value does not have any
// meaning, but it appears standard FORTRAN requires this.
//
SETERR = true;
SETERR
}
/// Error Status Indicator
///
/// Return .TRUE. if an error condition has been signaled via SIGERR.
/// FAILED is the SPICELIB status indicator.
///
/// # Required Reading
///
/// * [ERROR](crate::required_reading::error)
///
/// # Brief I/O
///
/// ```text
/// The function takes the value .TRUE. if an error condition
/// was detected; it is .FALSE. otherwise.
/// ```
///
/// # Detailed Output
///
/// ```text
/// Please read the required reading file before reading this!
///
/// The value taken by FAILED indicates status.
///
/// The status value applies to the SPICELIB routines,
/// and to any other routines which call the status-setting
/// routine, SIGERR.
///
/// When FAILED has the value, .TRUE., an error condition
/// exists. .FALSE. means "no error."
///
/// More specifically, when FAILED has the value .TRUE.,
/// some routine has indicated an error by calling the
/// SPICELIB routine, SIGERR. All SPICELIB routines
/// which can detect errors do this. Non-SPICELIB
/// routines may also reference SIGERR if desired.
///
/// When FAILED has the value .FALSE., either no routine
/// has yet signaled an error via SIGERR, or the status
/// has been reset using, what else, RESET.
///
/// FAILED is initialized to have the value, .FALSE.
/// This indicates a "no error" status.
///
/// See "particulars" below for (slightly) more information.
/// ```
///
/// # Exceptions
///
/// ```text
/// Error free.
///
/// 1) However, this routine is part of the SPICELIB error
/// handling mechanism.
/// ```
///
/// # Particulars
///
/// ```text
/// See the required reading file for details of error
/// processing. However, here are some notes:
///
/// When any SPICELIB routine detects an error, the
/// status is set to indicate an error condition via
/// a call to SIGERR. After SIGERR
/// returns, further calls to FAILED will return the
/// value, .TRUE., indicating an error condition.
///
/// Non-SPICELIB routines may also call SIGERR to indicate
/// an error condition; FAILED will reflect such calls
/// as well.
///
/// It is possible to re-set the error status to indicate
/// "no error" using the SPICELIB routine, RESET (see).
///
/// The effect on FAILED of resetting the status is
/// that FAILED will again return the value .FALSE.,
/// indicating "no error."
///
/// One of the main virtues of the SPICELIB error
/// handling mechanism is that you don't HAVE to test the
/// error status after every call to a SPICELIB routine.
/// If you set the error handling mode to 'RETURN', using
/// the routine, ERRACT, SPICELIB routines won't crash
/// when an error occurs; following the detection of the
/// error, each routine will return immediately upon entry.
/// Therefore, you call several SPICELIB routines in a
/// row, and just test status at the end of the sequence
/// of calls, if you wish. See "examples" below.
/// ```
///
/// # Examples
///
/// ```text
/// 1. Here's an example of a simple call to RDTEXT, followed
/// by a test of the status.
///
///
/// C
/// C We read a line of text from file SPUD.DAT:
/// C
///
/// CALL RDTEXT ( 'SPUD.DAT', LINE, EOF )
///
/// IF ( FAILED() ) THEN
///
/// C An error occurred during the read.
///
/// [respond to error here]
///
/// END IF
///
///
/// 2. Here's an example in which we don't want to
/// put the error test inside our loop. We just
/// test the error status after the loop terminates.
/// We can do this because we (that is, you, the user)
/// have made the call,
///
/// CALL ERRACT ( 'RETURN' )
///
/// prior to execution of the following code. If an
/// error does occur, the remaining calls to RDTEXT
/// will have no effect. Here's the example:
///
/// C
/// C We read the first 5000 lines of a file, or until
/// C EOF is reached, whichever comes first:
/// C
/// C Note: the "DO WHILE" construct is available in
/// C VAX FORTRAN.
/// C
///
/// LCOUNT = 0
/// DO WHILE ( ( .NOT. EOF ) .AND. ( LCOUNT .LE. 5000 ) )
///
/// CALL RDTEXT ( 'SPUD.DAT', LINE(LCOUNT), EOF )
///
/// LCOUNT = LCOUNT + 1
///
/// END DO
///
/// IF ( FAILED() ) THEN
/// C
/// C An error occurred during the read
/// C
/// [respond to error here]
///
/// END IF
/// ```
///
/// # Restrictions
///
/// ```text
/// 1) This routine automatically detects errors occurring in
/// the SPICELIB code. To make this routine work
/// for your own routines, your routines must call SIGERR
/// to report errors.
/// ```
///
/// # Author and Institution
///
/// ```text
/// N.J. Bachman (JPL)
/// J. Diaz del Rio (ODC Space)
/// W.L. Taber (JPL)
/// ```
///
/// # Version
///
/// ```text
/// - SPICELIB Version 1.1.0, 26-OCT-2021 (JDR) (NJB)
///
/// Added IMPLICIT NONE statement.
///
/// Edited the header to comply with NAIF standard.
///
/// - SPICELIB Version 1.0.1, 10-MAR-1992 (WLT)
///
/// Comment section for permuted index source lines was added
/// following the header.
///
/// - SPICELIB Version 1.0.0, 31-JAN-1990 (NJB)
/// ```
///
/// # Revisions
///
/// ```text
/// - Beta Version 1.1.0, 18-DEC-1989 (HAN)
///
/// Empty parentheses added to the ENTRY statement in order to
/// comply with the ANSI Fortran 77 Standard.
/// ```
pub fn failed(ctx: &mut SpiceContext) -> bool {
let ret = FAILED(ctx.raw_context());
ret
}
//$Procedure FAILED ( Error Status Indicator )
pub fn FAILED(ctx: &mut Context) -> bool {
let mut FAILED: bool = false;
//
// Executable Code:
//
//
// Grab saved status value:
//
// [f2rust] HACK: FAILED is called extremely frequently, and our
// standard implementation of SAVE variables (using a hashmap) has
// a noticeable performance cost, so we have some intrinsics
// specifically to optimise this case.
FAILED = ctx.get_spice_failed();
FAILED
}