ref: 5c59ce4b790db825f40a8b7de0e7086abb14eccb
dir: /src/cmd/size.c/
#include <errno.h> #include <stdarg.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <scc/arg.h> #include <scc/mach.h> static int status; static char *filename; static int tflag; static unsigned long long ttext, tdata, tbss, ttotal; char *argv0; static void error(char *fmt, ...) { va_list va; va_start(va, fmt); fprintf(stderr, "size: %s: ", filename); vfprintf(stderr, fmt, va); putc('\n', stderr); va_end(va); status = EXIT_FAILURE; } static void size(char *fname) { int type; Obj *obj; FILE *fp; unsigned long long text, data, bss, total; filename = fname; if ((fp = fopen(fname, "rb")) == NULL) { error(strerror(errno)); return; } if ((type = objtype(fp, NULL)) < 0) { error(strerror(errno)); goto err1; } if ((obj = objnew(type)) == NULL) { error("out of memory"); goto err1; } if (objread(obj, fp) < 0) { error("file corrupted"); goto err2; } objsize(obj, &text, &data, &bss); total = text + data + bss; printf("%llu\t%llu\t%llu\t%llu\t%llx\t%s\n", text, data, bss, total, total, fname); ttext += text; tdata += data; tbss += bss; ttotal += total; err2: objdel(obj); err1: fclose(fp); return; } static void usage(void) { fputs("usage: size [-t] file ...\n", stderr); exit(EXIT_FAILURE); } int main(int argc, char *argv[]) { unsigned long long total; ARGBEGIN { case 't': tflag = 1; break; default: usage(); } ARGEND if (argc == 1) usage; puts("text\tdata\tbss\tdec\thex\tfilename"); for (argc--; argc > 0; argc--) size(*argv++); if (tflag) { total = ttext + tdata + tbss; printf("%llu\t%llu\t%llu\t%llu\t%llx\t%s\n", ttext, tdata, tbss, total, total, "(TOTALS)"); } if (fflush(stdout)) { filename = "stdout"; error(strerror(errno)); } return status; }