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
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <error.h>
include <ctype.h>
include <pkg/rg.h>
define NRGS 10 # Allocation size
# RG_RANGES -- Parse a range string. Return a pointer to the ranges.
pointer procedure rg_ranges (rstr, rmin, rmax)
char rstr[ARB] # Range string
int rmin # Minimum value
int rmax # Maximum value
pointer rg # Range pointer
int i, fd, strlen(), open(), getline()
pointer sp, str, ptr
errchk open, rg_add
begin
call smark (sp)
call salloc (str, max (strlen (rstr), SZ_LINE), TY_CHAR)
call calloc (rg, LEN_RG, TY_STRUCT)
i = 1
while (rstr[i] != EOS) {
# Find beginning and end of a range and copy it to the work string
while (IS_WHITE(rstr[i]) || rstr[i]==',' || rstr[i]=='\n')
i = i + 1
if (rstr[i] == EOS)
break
ptr = str
while (!(IS_WHITE(rstr[i]) || rstr[i]==',' || rstr[i]=='\n' ||
rstr[i]==EOS)) {
Memc[ptr] = rstr[i]
i = i + 1
ptr = ptr + 1
}
Memc[ptr] = EOS
# Add range(s)
iferr {
if (Memc[str] == '@') {
fd = open (Memc[str+1], READ_ONLY, TEXT_FILE)
while (getline (fd, Memc[str]) != EOF) {
iferr (call rg_add (rg, Memc[str], rmin, rmax))
call erract (EA_WARN)
}
call close (fd)
} else
call rg_add (rg, Memc[str], rmin, rmax)
} then
call erract (EA_WARN)
}
call sfree (sp)
return (rg)
end
# RG_ADD -- Add a range
procedure rg_add (rg, rstr, rmin, rmax)
pointer rg # Range descriptor
char rstr[ARB] # Range string
int rmin # Minimum value
int rmax # Maximum value
int i, j, nrgs, strlen(), ctoi()
int rval1, rval2
pointer sp, str, ptr
begin
call smark (sp)
call salloc (str, strlen (rstr), TY_CHAR)
i = 1
while (rstr[i] != EOS) {
# Find beginning and end of a range and copy it to the work string
while (IS_WHITE(rstr[i]) || rstr[i]==',' || rstr[i]=='\n')
i = i + 1
if (rstr[i] == EOS)
break
ptr = str
while (!(IS_WHITE(rstr[i]) || rstr[i]==',' || rstr[i]=='\n' ||
rstr[i]==EOS)) {
if (rstr[i] == ':')
Memc[ptr] = ' '
else
Memc[ptr] = rstr[i]
i = i + 1
ptr = ptr + 1
}
Memc[ptr] = EOS
# Parse range
if (Memc[str] == '@')
call error (1, "Cannot nest @files")
else if (Memc[str] == '*') {
rval1 = rmin
rval2 = rmax
} else {
# Get range
j = 1
if (ctoi (Memc[str], j, rval1) == 0)
call error (1, "Range syntax error")
if (ctoi (Memc[str], j, rval2) == 0)
rval2 = rval1
}
# Check limits.
j = rval1
rval1 = min (j, rval2)
rval2 = max (j, rval2)
if (rval2 >= rmin && rval1 <= rmax) {
nrgs = RG_NRGS(rg)
if (mod (nrgs, NRGS) == 0)
call realloc (rg, LEN_RG+2*(nrgs+NRGS), TY_STRUCT)
nrgs = nrgs + 1
RG_NRGS(rg) = nrgs
RG_X1(rg, nrgs) = max (rmin, rval1)
RG_X2(rg, nrgs) = min (rmax, rval2)
RG_NPTS(rg) = RG_NPTS(rg) +
abs (RG_X1(rg, nrgs) - RG_X2(rg, nrgs)) + 1
}
}
call sfree (sp)
end
|