|
|
researchv10 Norman
#include "stdio.h"
typedef unsigned long ul;
typedef struct {
char *fname;
int len; /* how many counts have been seen */
int quot; /* how much has been allocated for cnt */
unsigned long *cnt;
} stab;
stab *tab;
int ntab, ltab;
FILE *fd, *sfd, *cfd;
char buf[256];
char fname[512] = "/";
extern char *malloc();
char flg[128];
unsigned long val;
main(argc, argv)
char **argv;
{ int i, j;
if(argc <= 1) {
fprintf(stderr, "subtract from where?\n");
exit(1);
}
if((fd = fopen("prof.out", "r")) == 0) {
perror("prof.out");
exit(1);
}
readall(fd);
fclose(fd);
sfd = fopen(argv[1], "r");
if(sfd == 0) {
perror(argv[1]);
exit(1);
}
suball(sfd);
fclose(sfd);
if((fd = fopen("prof.out", "w")) == 0) {
perror(argv[1]);
exit(1);
}
for(i = 0; i < ntab; i++)
rewrite(tab + i);
exit(0);
}
readall(fd)
FILE *fd;
{ int c, i, index;
stab *curtab = 0;
sawnl:
if((c = getc(fd)) == EOF)
return;
if(c == '\n')
goto sawnl;
if(c == '/') {
fscanf(fd, "%s", fname+1);
for(i = 0; i < ntab; i++)
if(strcmp(fname, tab[i].fname) == 0)
break;
if(i >= ntab) { /* new file */
if(ltab == 0) {
tab = (stab *)malloc(20 * sizeof(stab));
ltab = 20;
}
else if(ntab >= ltab)
tab = (stab *)realloc((char *)tab,
(ltab += 20) * sizeof(stab));
tab[ntab].fname = malloc(sizeof(fname) + 1);
strcpy(tab[ntab].fname, fname);
tab[ntab].len = tab[ntab].quot = 0;
ntab++;
}
curtab = tab + i;
index = 0;
}
else if(c < '0' || c > '9') {
fprintf(stderr, "prof.out has weird format\n");
abort();
}
else {
ungetc(c, fd);
fscanf(fd, "%d", &val);
if(curtab->len <= index) {
if(curtab->quot == 0) {
curtab->cnt = (ul *)malloc(100*sizeof(long));
curtab->quot = 100;
for(i = 0; i < 100; i++)
curtab->cnt[i] = 0;
}
else if(curtab->len >= curtab->quot) {
curtab->cnt = (ul *)realloc(curtab->cnt,
(curtab->quot += 200) * sizeof(long));
for(i = curtab->quot-200; i < curtab->quot; i++)
curtab->cnt[i] = 0;
}
curtab->len++;
}
curtab->cnt[index++] += val;
}
goto sawnl;
}
rewrite(x)
stab *x;
{ int i;
for(i = 0; i < x->len; i++)
if(x->cnt[i])
break;
if(i >= x->len)
return;
fprintf(fd, "%s\n", x->fname);
for(i = 0; i < x->len; i++)
fprintf(fd, "%u\n", x->cnt[i]);
}
suball(fd)
FILE *fd;
{ int c, i, index;
stab *curtab = 0;
sawnl:
if((c = getc(fd)) == EOF)
return;
if(c == '\n')
goto sawnl;
if(c == '/') {
fscanf(fd, "%s", fname+1);
for(i = 0; i < ntab; i++)
if(strcmp(fname, tab[i].fname) == 0)
break;
if(i >= ntab) { /* new file */
fprintf(stderr, "new file %s ignored\n", fname);
goto sawnl;
}
curtab = tab + i;
index = 0;
}
else if(c < '0' || c > '9') {
fprintf(stderr, "prof.out has weird format\n");
abort();
}
else {
ungetc(c, fd);
fscanf(fd, "%d", &val);
curtab->cnt[index++] -= val;
}
goto sawnl;
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.