asize.c

来自「操作系统源代码」· C语言 代码 · 共 94 行

C
94
字号
/* @(#)asize.c	1.4 */#define	ushort	unsigned short#include	<stdio.h>#include 	"out.h"/*	asize -- determine object size*/main(argc, argv)char **argv;{	struct outhead	buf;	struct outsect	sbuf;	ushort		nrsect;	long		sum;	int		gorp;	FILE		*f;	if (--argc == 0) {		argc = 1;		argv[1] = "a.out";	}	gorp = argc;	while(argc--) {		if ((f = fopen(*++argv, "r"))==NULL) {			fprintf(stderr, "asize: cannot open %s\n", *argv);			continue;		}		getofmt ((char *)&buf, SF_HEAD , f);		if(BADMAGIC(buf)) {			fprintf(stderr, "asize: %s-- bad format\n", *argv);			fclose(f);			continue;		}		nrsect = buf.oh_nsect;		if (nrsect == 0) {			fprintf(stderr, "asize: %s-- no sections\n", *argv);			fclose(f);			continue;		}		if (gorp > 1)			printf("%s: ", *argv);		sum = 0;		while (nrsect-- > 0) {			getofmt ((char *)&sbuf, SF_SECT , f);			printf("%ld", sbuf.os_size);			sum += sbuf.os_size;			if (nrsect > 0)				putchar('+');		}		printf(" = %ld = 0x%lx\n", sum, sum);		fclose(f);	}}getofmt(p, s, f)register char	*p;register char	*s;register FILE	*f;{	register i;	register long l;	for (;;) {		switch (*s++) {/*		case '0': p++; continue; */		case '1':			*p++ = getc(f);			continue;		case '2':			i = getc(f);			i |= (getc(f) << 8);			*((short *)p) = i; p += sizeof(short);			continue;		case '4':			l = (long)getc(f);			l |= ((long)getc(f) << 8);			l |= ((long)getc(f) << 16);			l |= ((long)getc(f) << 24);			*((long *)p) = l; p += sizeof(long);			continue;		default:		case '\0':			break;		}		break;	}}

⌨️ 快捷键说明

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