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
|
define USRERR 1
# PUTTABHDR -- Put a keyword given as a string in a table header
#
# B.Simon 14-Aug-87 First Code
# B.Simon 27-Jul-94 Fix bug in addition of double
# B.Simon 10-Nov-95 Add check for history keyword
procedure puttabhdr (hd, keyword, value, keytype, add)
pointer hd # i: Table descriptor
char keyword[ARB] # i: Keyword to put
char value[ARB] # i: Keyword value
int keytype # i: Keyword type
bool add # i: Is adding a new keyword legal?
#--
bool bvalue
double dvalue
int ip, junk, hdrtype, keynum
pointer sp, errtxt
string badtyperr "Type mismatch in header keyword (%s)"
string notadderr "Keyword not found in header (%s)"
bool tbhisc()
int ctod(), tabhdrtyp(), stridx()
begin
call smark (sp)
call salloc (errtxt, SZ_LINE, TY_CHAR)
# Convert keyword value to a double
ip = 1
junk = ctod (value, ip, dvalue)
# If keyword is not already in the table header
# or this is a history keyword
call tbhfkw (hd, keyword, keynum)
if ( keynum == 0 || tbhisc (keyword)) {
# Check to see if it legal to add a new keyword
if (! add) {
call sprintf (Memc[errtxt], SZ_LINE, notadderr)
call pargstr (keyword)
call error (USRERR, Memc[errtxt])
}
# Create the new keyword and set its value
switch (keytype) {
case TY_BOOL :
bvalue = stridx (value[1], "TtYy") > 0
call tbhadb (hd, keyword, bvalue)
case TY_CHAR :
call tbhadt (hd, keyword, value)
case TY_SHORT,TY_INT,TY_LONG :
call tbhadi (hd, keyword, int(dvalue))
case TY_REAL :
call tbhadr (hd, keyword, real(dvalue))
case TY_DOUBLE :
call tbhadd (hd, keyword, dvalue)
}
} else {
hdrtype = tabhdrtyp (hd, keyword)
# Check for illegal type conversions
if ((hdrtype == TY_BOOL && keytype != TY_BOOL) ||
(!(hdrtype == keytype || hdrtype == TY_CHAR) &&
(keytype == TY_BOOL || keytype == TY_CHAR) ) ) {
call sprintf (Memc[errtxt], SZ_LINE, badtyperr)
call pargstr (keyword)
call error (USRERR, Memc[errtxt])
}
# Use the proper procedure to write the new keyword value
switch (hdrtype) {
case TY_BOOL :
bvalue = stridx (value[1], "TtYy") > 0
call tbhptb (hd, keyword, bvalue)
case TY_CHAR :
call tbhptt (hd, keyword, value)
case TY_SHORT,TY_INT,TY_LONG :
call tbhpti (hd, keyword, int(dvalue))
case TY_REAL :
call tbhptr (hd, keyword, real(dvalue))
case TY_DOUBLE :
call tbhptd (hd, keyword, dvalue)
}
}
call sfree (sp)
return
end
|