|
DataMuseum.dkPresents historical artifacts from the history of: Commodore CBM-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Commodore CBM-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 2571 (0xa0b) Types: TextFile Notes: UNIX file Names: »size.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code └─⟦f4b8d8c84⟧ UNIX Filesystem └─⟦this⟧ »cmd/size.c«
/* * size -- l.out sizes. * size [-c] [file file ...] * dgc 10-Oct-80 */ #include <stdio.h> #include <canon.h> #include "n.out.h" int cflag; int tflag; FILE *fp; long tsize[L_DEBUG]; long tcomm; long total; main(argc, argv) char *argv[]; { register char *p; register c, i; int nf; i = 1; while (i<argc && argv[i][0]=='-') { p = &argv[i][1]; while (c = *p++) { switch (c) { case 'c': ++cflag; break; case 't': ++tflag; break; default: usage(); } } ++i; } if ((nf = argc-i) != 0) { while (i < argc) size(argv[i++], nf>1); if (nf>1 && tflag) { printf("Total: "); for (i=L_SHRI; i<L_DEBUG; ++i) { if (i != L_SHRI) putchar('+'); printf("%D", tsize[i]); } if (cflag && tcomm!=0) printf("+%D", tcomm); printf(" %D (", total); printf(AFMT, (vaddr_t)total); printf(")\n"); } } else size("l.out", 0); } size(fn, f) char *fn; { register i; long b, c, s, t; struct ldheader ldh; struct ldsym lds; if ((fp = fopen(fn, "r")) == NULL) { fprintf(stderr, "%s: cannot open.\n", fn); return; } fread(&ldh, sizeof(ldh), 1, fp); canshort(ldh.l_magic); if (feof(fp) || ldh.l_magic!=L_MAGIC) { fprintf(stderr, "%s: not an object file.\n", fn); fclose(fp); return; } canshort(ldh.l_flag); if ((ldh.l_flag & LF_32) != 0) { canshort(ldh.l_tbase); b = ldh.l_tbase; } else b = sizeof(ldh) - 2*sizeof(short); if (f) printf("%s: ", fn); t = 0; for (i=L_SHRI; i<L_SYM; ++i) { cansize(ldh.l_ssize[i]); s = ldh.l_ssize[i]; if (i != L_DEBUG) { if (i != L_SHRI) putchar('+'); printf("%D", s); t += s; tsize[i] += s; } if(i!=L_BSSI && i!=L_BSSD) b += s; } if (cflag) { c = 0; fseek(fp, b, 0); cansize(ldh.l_ssize[L_SYM]); if (ldh.l_flag & LF_32) { while (ldh.l_ssize[L_SYM]) { fread(&lds, sizeof(lds), 1, fp); canshort(lds.ls_type); canlong(lds.ls_addr); if (lds.ls_type == (L_GLOBAL|L_REF)) c += (long)lds.ls_addr; ldh.l_ssize[L_SYM] -= sizeof(lds); } } else { while (ldh.l_ssize[L_SYM]) { fread(&lds, sizeof(lds)-sizeof(short), 1, fp); canshort(lds.ls_type); i = *(unsigned *)(&lds.ls_addr); canshort(i); if (lds.ls_type == (L_GLOBAL|L_REF)) c += (unsigned)i; ldh.l_ssize[L_SYM] -= sizeof(lds)-sizeof(short); } } if (c != 0) { printf("+%D", c); t += c; tcomm += c; } } printf(" %D (", t); printf(AFMT, (vaddr_t)t); printf(")\n"); total += t; fclose(fp); } usage() { fprintf(stderr, "Usage: size [-ct] [file ...]\n"); exit(1); }