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
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <mach.h>
include <error.h>
include <ctype.h>
define SZ_FORMAT 11
# FENCD -- Format a real variable and return as a spp character string.
# A packed format string is passed as an input argument to define how the
# number is to be encoded. The format of the format string is:
# format string = "(cW.D)"
# where c is one of [EFGI], and where W and D are the field width and
# number of decimal places or precision, respectively.
procedure fencd (nchars, f_format, spp_outstr, rval)
int nchars # desired number of output chars
char f_format[SZ_FORMAT+1] # SPP string containing format
char spp_outstr[SZ_FORMAT+1] # SPP string containing encoded number
real rval # value to be encoded
char fmtchar, outstr[MAX_DIGITS], spp_format[SZ_FORMAT+1]
int ip, op, stridx()
real x
begin
# Encode format string for SPRINTF, format "%w.d". Start copying
# Fortran format at char 3, which should follow the EFGI char.
spp_format[1] = '%'
op = 2
if (f_format[1] != '(')
call fatal (1, "Missing lparen in Ncar ENCODE format")
for (ip=3; f_format[ip] != ')' && f_format[ip] != EOS; ip=ip+1) {
spp_format[op] = f_format[ip]
op = op + 1
}
# Now add the SPP format character. EFG are the same for sprintf as
# as for Fortran. The integer format is 'd' for decimal in SPP.
fmtchar = f_format[2]
if (IS_UPPER(fmtchar))
fmtchar = TO_LOWER (fmtchar)
switch (fmtchar) {
case 'e', 'f', 'g':
spp_format[op] = fmtchar
case 'i':
spp_format[op] = 'd'
default:
call fatal (1, "Unknown Ncar ENCODE format code")
}
op = op + 1
spp_format[op] = EOS
x = rval
if (rval > 0)
x = -x
# Now encode the user supplied variable and return it as a spp
# string.
iferr {
call sprintf (outstr, MAX_DIGITS, spp_format)
call pargr (x)
} then
call erract (EA_FATAL)
# Let's try adding a "+" prefix to positive numbers to set if that
# makes nicer plots.
op = stridx ('-', outstr)
if (rval > 0 && op > 0)
outstr[op] = '+'
call strcpy (outstr, spp_outstr, SZ_LINE)
end
|