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
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <ctype.h>
# Read a list of strings from the standard input or a list of files and
# assemble them into a nicely formatted table. If reading from multiple
# input files, make a separate table for each. There is no fixed limit
# to the size of the table which can be formatted. The table is not
# sorted; this should be done as a separate operation if desired.
define INIT_STRBUF 512
define STRBUF_INCREMENT 1024
define INIT_MAXSTR 64
define MAXSTR_INCREMENT 128
procedure t_table()
int list, first_col, last_col, ncols, maxstrlen
int fd, nextch, nstrings, maxch, sz_strbuf, max_strings, ip
pointer sp, strbuf, fname, stroff
int strlen(), fscan(), nscan(), clpopni()
int clgfil(), open(), envgeti(), clplen(), clgeti()
begin
# Allocate buffers. The string buffer "strbuf", and associated list
# of offsets "stroff" will be reallocated later if they fill up.
call smark (sp)
call salloc (fname, SZ_FNAME, TY_CHAR)
call malloc (strbuf, INIT_STRBUF, TY_CHAR)
call malloc (stroff, INIT_MAXSTR, TY_INT)
# Get various table formatting parameters from CL.
ncols = clgeti ("ncols")
first_col = clgeti ("first_col")
last_col = clgeti ("last_col")
# Attempt to read the terminal x-dimension from the environment,
# if the user did not specify a valid "last_col". No good reason
# to abort if cannot find environment variable.
if (last_col == 0)
iferr (last_col = envgeti ("ttyncols"))
last_col = 80
# Set maximum string length to size of an output line if max length
# not given.
maxstrlen = clgeti ("maxstrlen")
if (maxstrlen == 0)
maxch = last_col - first_col + 1
else
maxch = min (maxstrlen, last_col - first_col + 1)
max_strings = INIT_MAXSTR
sz_strbuf = INIT_STRBUF
# Read the contents of each file into a big string buffer. Print a
# separate table for each file.
list = clpopni ("input_files")
while (clgfil (list, Memc[fname], SZ_FNAME) != EOF) {
fd = open (Memc[fname], READ_ONLY, TEXT_FILE)
nextch = 1
nstrings = 0
# If printing several tables, label each with the name of the file.
if (clplen (list) > 1) {
call printf ("\n==> %s <==\n")
call pargstr (Memc[fname])
}
while (fscan (fd) != EOF) {
call gargstr (Memc[strbuf+nextch-1], maxch)
# Ignore blank lines and faulty scans.
if (nscan() == 0)
next
for (ip=strbuf+nextch-1; IS_WHITE (Memc[ip]); ip=ip+1)
;
if (Memc[ip] == '\n' || Memc[ip] == EOS)
next
# Save one indexed string index for strtbl.
Memi[stroff+nstrings] = nextch
nextch = nextch + strlen (Memc[strbuf+nextch-1]) + 1
# Check buffers, make bigger if necessary.
if (nextch + maxch >= sz_strbuf) {
sz_strbuf = sz_strbuf + STRBUF_INCREMENT
call realloc (strbuf, sz_strbuf, TY_CHAR)
}
# Add space for more string offsets if too many strings.
nstrings = nstrings + 1
if (nstrings > max_strings) {
max_strings = max_strings + MAXSTR_INCREMENT
call realloc (stroff, max_strings, TY_INT)
}
}
# Print the table on the standard output.
call strtbl (STDOUT, Memc[strbuf], Memi[stroff], nstrings,
first_col, last_col, maxch, ncols)
}
call clpcls (list)
call mfree (strbuf, TY_CHAR)
call mfree (stroff, TY_INT)
call sfree (sp)
end
|