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
|