aboutsummaryrefslogtreecommitdiff
path: root/pkg/system/count.x
blob: 9f9ef51c7ae26a4091f03736fc076dfe5bd839f8 (plain) (blame)
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
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.

include	<ctype.h>
include	<chars.h>
include	<error.h>

define	SZ_LUT		256		# "whitespace" lookup table
define	CC_WHITE	1		# "white" character class
define	CC_NONWHITE	0		# "word" character

# COUNT -- Count the number of lines, words, and characters in the named text
# files, or in the standard input.  Print the results on the standard output.
# 
# output format (single file):
# 
# 	nlines nwords nchars
# 
# output format (several files):
# 
# 	nlines nwords nchars filename1
# 	nlines nwords nchars filename2
# 	nlines nwords nchars Total

procedure t_count()

char	fname[SZ_FNAME]
long	nlines, nwords, nchars
long	totlines, totwords, totchars
int	nfiles, list
int	clpopni(), clgfil()

begin
	totlines = 0
	totwords = 0
	totchars = 0
	nfiles = 0

	list = clpopni ("files")

	while (clgfil (list, fname, SZ_FNAME) != EOF) {
	    iferr (call count_file (fname, nlines, nwords, nchars))
		call erract (EA_WARN)
	    else {
		call print_stats (STDOUT, nlines, nwords, nchars, fname)
		call flush (STDOUT)
	    }

	    totlines = totlines + nlines
	    totwords = totwords + nwords
	    totchars = totchars + nchars
	    nfiles = nfiles + 1
	}

	call clpcls (list)

	if (nfiles > 1)
	    call print_stats (STDOUT, totlines, totwords, totchars, "Total")
end


# COUNT_FILE -- Open a file and count the number of lines, words, and
# characters in the file.

procedure count_file (fname, nlines, nwords, nchars)

char	fname[SZ_FNAME], lbuf[SZ_LINE], ch, class[SZ_LUT]
long	nlines, nwords, nchars
int	first_time, state, fd, ip, open(), getline()
errchk	open, getline
data	first_time /YES/

begin
	# Initialize the lookup table, used to count words.  In this case,
	# NEWLINE is considered to be whitespace.

	if (first_time == YES) {
	    do ip = 1, SZ_LUT
		class[ip] = CC_NONWHITE

	    class[BLANK] = CC_WHITE
	    class[TAB] = CC_WHITE
	    class[NEWLINE] = CC_WHITE

	    first_time = NO
	}

	fd = open (fname, READ_ONLY, TEXT_FILE)

	nwords = 0
	nchars = 0
	state = CC_WHITE

	# Increment word count at the beginning of every word.  A "word"
	# is defined as a sequence of characters delimited by whitespace.
	# COUNT does not know anything about quoted strings.

	for (nlines=0;  getline (fd, lbuf) != EOF;  ) {
	    do ip = 1, SZ_LINE {
		ch = lbuf[ip]
		if (ch == EOS)
		    break
		else if (class[ch] != state) {
		    nwords = nwords + state
		    state = class[ch]
		}
	    }
	    nchars = nchars + ip - 1
	    if (lbuf[ip-1] == '\n')
		nlines = nlines + 1
	}   

	call close (fd)
end


# PRINT_STATS -- Format the COUNT statistics summary line and print it on
# the named file.

procedure print_stats (fd, nlines, nwords, nchars, fname)

int	fd
long	nlines, nwords, nchars
char	fname[ARB]

begin
	call fprintf (fd, "%7d %7d %7d %s\n")
	    call pargl (nlines)
	    call pargl (nwords)
	    call pargl (nchars)
	    call pargstr (fname)
end