⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sum.c

📁 操作系统源代码
💻 C
字号:
/* sum - checksum a file		Author: Martin C. Atkins *//* *	This program was written by: *		Martin C. Atkins, *		University of York, *		Heslington, *		York. Y01 5DD *		England *	and is released into the public domain, on the condition *	that this comment is always included without alteration. */#include <sys/types.h>#include <fcntl.h>#include <stdlib.h>#include <unistd.h>#include <minix/minlib.h>#include <stdio.h>#define BUFFER_SIZE (512)int rc = 0;char *defargv[] = {"-", 0};_PROTOTYPE(int main, (int argc, char **argv));_PROTOTYPE(void error, (char *s, char *f));_PROTOTYPE(void sum, (int fd, char *fname));_PROTOTYPE(void putd, (int number, int fw, int zeros));int main(argc, argv)int argc;char *argv[];{  register int fd;  if (*++argv == 0) argv = defargv;  for (; *argv; argv++) {	if (argv[0][0] == '-' && argv[0][1] == '\0')		fd = 0;	else		fd = open(*argv, O_RDONLY);	if (fd == -1) {		error("can't open ", *argv);		rc = 1;		continue;	}	sum(fd, (argc > 2) ? *argv : (char *) 0);	if (fd != 0) close(fd);  }  return(rc);}void error(s, f)char *s, *f;{  std_err("sum: ");  std_err(s);  if (f) std_err(f);  std_err("\n");}void sum(fd, fname)int fd;char *fname;{  char buf[BUFFER_SIZE];  register int i, n;  long size = 0;  unsigned crc = 0;  unsigned tmp, blks;  while ((n = read(fd, buf, BUFFER_SIZE)) > 0) {	for (i = 0; i < n; i++) {		crc = (crc >> 1) + ((crc & 1) ? 0x8000 : 0);		tmp = buf[i] & 0377;		crc += tmp;		crc &= 0xffff;		size++;	}  }  if (n < 0) {	if (fname)		error("read error on ", fname);	else		error("read error", (char *) 0);	rc = 1;	return;  }  putd(crc, 5, 1);  blks = (size + (long) BUFFER_SIZE - 1L) / (long) BUFFER_SIZE;  putd(blks, 6, 0);  if (fname) printf(" %s", fname);  printf("\n");}void putd(number, fw, zeros)int number, fw, zeros;{/* Put a decimal number, in a field width, to stdout. */  char buf[10];  int n;  unsigned num;  num = (unsigned) number;  for (n = 0; n < fw; n++) {	if (num || n == 0) {		buf[fw - n - 1] = '0' + num % 10;		num /= 10;	} else		buf[fw - n - 1] = zeros ? '0' : ' ';  }  buf[fw] = 0;  printf("%s", buf);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -