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
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <syserr.h>
include <ctype.h>
include "environ.h"
define MAXLEV 8 # max nesting of includes
define SZ_LBUF (SZ_COMMAND+SZ_LINE) # max length SET on a single line
# ENVSCAN -- Parse one or more SET or RESET declarations and enter them into
# the environment list.
#
# Syntax: (set|reset) name = value enter a definition
# set @filename scan a file
#
# Comments, blank lines, and lines containing unrecognized statements are
# ignored without warning.
int procedure envscan (cmd)
char cmd[ARB] # command text to begin scan
char ch
int fd, in, nset, lev, sv_fd[MAXLEV]
pointer sp, ip, op, op_top, lbuf, name, value
int open(), stropen(), getlline(), strmatch(), nowhite()
errchk open, stropen, getlline, syserrs
string s_reset "^#reset#"
string s_set "^#set#"
define again_ 91
begin
call smark (sp)
call salloc (lbuf, SZ_LBUF, TY_CHAR)
call salloc (name, MAX_SZKEY, TY_CHAR)
call salloc (value, MAX_SZVALUE, TY_CHAR)
# Position to after the set or reset.
in = strmatch (cmd, s_set)
if (in == 0) {
in = strmatch (cmd, s_reset)
if (in == 0) {
call sfree (sp)
return (0)
}
}
# Open the input to be scanned.
if (cmd[in] == '@')
fd = open (cmd[in+1], READ_ONLY, TEXT_FILE)
else
fd = stropen (cmd, ARB, READ_ONLY)
# Process all SET or RESET statements in the file. Ignore all other
# statements.
nset = 0
lev = 0
repeat {
# Get the next SET statement into lbuf, leave IN at index of first
# char of the name field.
if (getlline (fd, Memc[lbuf], SZ_LBUF) == EOF) {
if (lev > 0) {
call close (fd)
fd = sv_fd[lev]
lev = lev - 1
next
} else
break
} else if (Memc[lbuf] == '\n' || Memc[lbuf] == '#') {
next
} else {
in = strmatch (Memc[lbuf], s_set)
if (in == 0)
in = strmatch (Memc[lbuf], s_reset)
if (in <= 0)
next
else if (Memc[lbuf+in-1] == '@') {
ch = nowhite (Memc[lbuf+in], Memc[lbuf], SZ_LINE)
lev = lev + 1
if (lev > MAXLEV)
call syserrs (SYS_FOPEN, Memc[lbuf])
sv_fd[lev] = fd
fd = open (Memc[lbuf], READ_ONLY, TEXT_FILE)
next
}
}
# Parse the name and value strings and enter into the environment
# list. Ignore optional quotes and whitespace. Ignore rest of
# line following the value field.
op = name
op_top = name + MAX_SZKEY
ip = lbuf + in - 1
for (ch=Memc[ip]; ch != '=' && ch != EOS; ch=Memc[ip]) {
if (!IS_QUOTE(ch) && !IS_WHITE(ch)) {
Memc[op] = Memc[ip]
op = min (op_top, op + 1)
}
ip = ip + 1
}
Memc[op] = EOS
op = value
if (Memc[ip] == '=') {
ip = ip + 1
while (IS_WHITE(Memc[ip]) || IS_QUOTE(Memc[ip]))
ip = ip + 1
op_top = value + MAX_SZVALUE
for (ch=Memc[ip]; ch != EOS; ch=Memc[ip]) {
if (IS_QUOTE(ch) || ch == '\n') {
break
} else if (ch == '\\' && Memc[ip+1] == '\n') {
again_ if (getlline (fd, Memc[lbuf], SZ_LBUF) == EOF)
break
# Skip leading whitespace on the continuation line.
for (ip=lbuf; IS_WHITE(Memc[ip]); ip=ip+1)
;
# Check for a commented out continuation line.
if (Memc[ip] == '#')
goto again_
} else {
Memc[op] = ch
op = min (op_top, op + 1)
ip = ip + 1
}
}
}
Memc[op] = EOS
# Enter the SET definition into the environment list.
call envreset (Memc[name], Memc[value])
nset = nset + 1
}
call close (fd)
call sfree (sp)
return (nset)
end
|