V8/usr/src/cmd/sum.c

Compare this file to the similar file:
Show the results in this format:

/*
 * Sum bytes in file mod 2^16
 */

#include <stdio.h>
#define BUFSIZE	1024
#define MAXSTR	512
/* disk block size for backward compatability */
#define	BLOKSIZE	1024

extern char	*gets();

char	*ego;

main (argc, argv)
	int	argc;
	char	*argv[];
{
	char	s[MAXSTR];
	int	i, errcode = 0;

	ego = argv[0];

	if (argc < 2)
		sumfile ((char *) 0);
	else	for (i = 1; i < argc; i++)
			if (*argv[i] != '-')
				errcode += sumfile (argv[i]);
			else	switch (argv[i][1]) {
				case 0:
					while (gets (s))
						errcode += sumfile (s);
					break;
				default:
					goto usage;
				}

	exit (errcode);

usage:
	fprintf (stderr, "usage: %s [-] [file]...\n", ego);
	exit (1);
}


sumfile (path)
	char	*path;
{
	static unsigned char	buf[BUFSIZE];
	register unsigned char	*s;
	register int		n, fd;
	register long		nbytes = 0;
	register unsigned int	sum = 0;

	if (!path)
		fd = 0;
	else	if (0 > (fd = open (path, 0))) {
			fprintf (stderr, "%s: %s: can't open\n", ego, path);
			return (1);
		}


	for (;;)
		if (0 >= (n = read (fd, buf, BUFSIZE))) {
			(void) close (fd);
			if (n < 0) {
				fprintf (stderr, "%s: %s: read error\n",
				    ego, path? path: "<standard input>");
				return (1);
			}
			/* should produce same format as old version always */
			printf ("%05u%6ld", sum,
				(nbytes + (BLOKSIZE - 1)) / BLOKSIZE);
			if (path)
				printf(" %s", path);
			putchar('\n');
			return (0);
		}
		else	for (nbytes += n, s = buf; n; n--, s++)
				if (sum & 1)
					sum = 0xffff & ((sum>>1) + *s + 0x8000);
				else	sum = 0xffff & ((sum>>1) + *s);
}