Annotation of researchv10no/cmd/lcc/etc/bprint.c, revision 1.1.1.1

1.1       root        1: #include <assert.h>
                      2: #include <ctype.h>
                      3: #include <stdio.h>
                      4: #include <stdlib.h>
                      5: #include <string.h>
                      6: 
                      7: /*
                      8:  * bprint [ -c | -Idir... | -f | -b | -n ] [ file... ]
                      9:  * annotate listings of files with prof.out data
                     10:  *
                     11:  */
                     12: 
                     13: char *progname;
                     14: int number;
                     15: char *dirs[20];
                     16: #define NDIRS (sizeof dirs/sizeof dirs[0] - 1)
                     17: 
                     18: char *alloc(int);
                     19: char *string(char *);
                     20: 
                     21: int process(char *);
                     22: 
                     23: #define BPRINT
                     24: #include "../c/profio.c"
                     25: 
                     26: void emitdata(char *);
                     27: void printfile(struct file *, int);
                     28: void printfuncs(struct file *, int);
                     29: 
                     30: int fcount;
                     31: 
                     32: int main(int argc, char *argv[]) {
                     33:        int i;
                     34:        struct file *p;
                     35:        void (*f)(struct file *, int) = printfile;
                     36: 
                     37:        progname = argv[0];
                     38:        if ((i = process("prof.out")) <= 0) {
                     39:                fprintf(stderr, "%s: can't %s `%s'\n", progname,
                     40:                        i == 0 ? "open" : "interpret", "prof.out");
                     41:                exit(1);
                     42:        }
                     43:        for (i = 1; i < argc && *argv[i] == '-'; i++)
                     44:                if (strcmp(argv[i], "-c") == 0) {
                     45:                        emitdata("prof.out"); 
                     46:                        exit(0);
                     47:                } else if (strcmp(argv[i], "-b") == 0)
                     48:                        f = printfile;
                     49:                else if (strcmp(argv[i], "-f") == 0) {
                     50:                        fcount++;
                     51:                        f = printfuncs;
                     52:                } else if (strcmp(argv[i], "-n") == 0)
                     53:                        number++;
                     54:                else if (strncmp(argv[i], "-I", 2) == 0) {
                     55:                        int j;
                     56:                        for (j = 0; j < NDIRS && dirs[j]; j++)
                     57:                                ;
                     58:                        if (j < NDIRS)
                     59:                                dirs[j] = &argv[i][2];
                     60:                        else
                     61:                                fprintf(stderr, "%s: too many -I options\n", progname);
                     62:                } else {
                     63:                        fprintf(stderr, "usage: %s [ -c | -b | -n | -f | -Idir... ] [ file... ]\n", progname);
                     64:                        exit(1);
                     65:                }
                     66:        for (p = filelist; p; p = p->link)
                     67:                qsort(p->counts, p->count, sizeof *p->counts,
                     68:                        (int (*)(const void *, const void *))compare);
                     69:        if (i < argc) {
                     70:                int nf = i < argc - 1 ? 1 : 0;
                     71:                for ( ; i < argc; i++, nf ? nf++ : 0)
                     72:                        if (p = findfile(string(argv[i])))
                     73:                                (*f)(p, nf);
                     74:                        else
                     75:                                fprintf(stderr, "%s: no data for `%s'\n", progname, argv[i]);
                     76:        } else {
                     77:                int nf = filelist && filelist->link ? 1 : 0;
                     78:                for (p = filelist; p; p = p->link, nf ? nf++ : 0)
                     79:                        (*f)(p, nf);
                     80:        }
                     81:        return 0;
                     82: }
                     83: 
                     84: /* alloc - allocate n bytes or die */
                     85: char *alloc(int n) {
                     86:        char *new = (char *)malloc(n);
                     87: 
                     88:        assert(new);
                     89:        return new;
                     90: }
                     91: 
                     92: /* emitdata - write prof.out data to file */
                     93: void emitdata(char *file) {
                     94:        FILE *fp;
                     95: 
                     96:        if (fp = fopen(file, "w")) {
                     97:                struct file *p;
                     98:                for (p = filelist; p; p = p->link) {
                     99:                        int i;
                    100:                        struct func *q;
                    101:                        struct caller *r;
                    102:                        fprintf(fp, "1\n%s\n", p->name);
                    103:                        for (i = 0, q = p->funcs; q; i++, q = q->link)
                    104:                                if (r = q->callers)
                    105:                                        for (i--; r; r = r->link)
                    106:                                                i++;
                    107:                        fprintf(fp, "%d\n", i);
                    108:                        for (q = p->funcs; q; q = q->link)
                    109:                                if (q->count.count == 0 || !q->callers)
                    110:                                        fprintf(fp, "%s 1 %d %d %d ? ? 0 0\n", q->name, q->count.x,
                    111:                                                q->count.y, q->count.count);
                    112:                                else
                    113:                                        for (r = q->callers; r; r = r->link)
                    114:                                                fprintf(fp, "%s 1 %d %d %d %s %s %d %d\n", q->name, q->count.x,
                    115:                                                        q->count.y, r->count, r->name, r->file, r->x, r->y);
                    116:                        fprintf(fp, "%d\n", p->count);
                    117:                        for (i = 0; i < p->count; i++)
                    118:                                fprintf(fp, "1 %d %d %d\n", p->counts[i].x,
                    119:                                        p->counts[i].y, p->counts[i].count);
                    120:                }
                    121:                fclose(fp);
                    122:        } else
                    123:                fprintf(stderr, "%s: can't create `%s'\n", progname, file);
                    124: }
                    125: 
                    126: /* openfile - open name for reading, searching -I directories */
                    127: FILE *openfile(char *name) {
                    128:        int i;
                    129:        FILE *fp;
                    130: 
                    131:        if (*name != '/')       
                    132:                for (i = 0; dirs[i]; i++) {
                    133:                        char buf[200];
                    134:                        sprintf(buf, "%s/%s", dirs[i], name);
                    135:                        if (fp = fopen(buf, "r"))
                    136:                                return fp;
                    137:                }
                    138:        return fopen(name, "r");
                    139: }
                    140: 
                    141: /* printfile - print annotated listing for p */
                    142: void printfile(struct file *p, int nf) {
                    143:        int lineno;
                    144:        FILE *fp;
                    145:        char *s, buf[512];
                    146:        struct count *u = p->counts, *r, *uend;
                    147: 
                    148:        if (u == 0 || p->count <= 0)
                    149:                return;
                    150:        uend = &p->counts[p->count];
                    151:        if ((fp = openfile(p->name)) == NULL) {
                    152:                fprintf(stderr, "%s: can't open `%s'\n", progname, p->name);
                    153:                return;
                    154:        }
                    155:        if (nf)
                    156:                printf("%s%s:\n\n", nf == 1 ? "" : "\f", p->name);
                    157:        for (lineno = 1; fgets(buf, sizeof buf, fp); lineno++) {
                    158:                if (number)
                    159:                        printf("%d\t", lineno);
                    160:                while (u < uend && u->y < lineno)
                    161:                        u++;
                    162:                for (s = buf; *s; ) {
                    163:                        char *t = s + 1;
                    164:                        while (u < uend && u->y == lineno && u->x < s - buf)
                    165:                                u++;
                    166:                        if (isalnum(*s) || *s == '_')
                    167:                                while (isalnum(*t) || *t == '_')
                    168:                                        t++;
                    169:                        while (u < uend && u->y == lineno && u->x < t - buf) {
                    170:                                printf("<%d>", u->count);
                    171:                                for (r = u++; u < uend && u->x == r->x && u->y == r->y && u->count == r->count; u++)
                    172:                                        ;
                    173:                        }
                    174:                        while (s < t)
                    175:                                putchar(*s++);
                    176:                }
                    177:                if (*s)
                    178:                        printf("%s", s);
                    179:        }
                    180:        fclose(fp);
                    181: }
                    182: 
                    183: /* printfuncs - summarize data for functions in p */
                    184: void printfuncs(struct file *p, int nf) {
                    185:        struct func *q;
                    186: 
                    187:        if (nf)
                    188:                printf("%s:\n", p->name);
                    189:        for (q = p->funcs; q; q = q->link)
                    190:                if (fcount <= 1 || q->count.count == 0 || !q->callers)
                    191:                        printf("%d\t%s\n", q->count.count, q->name);
                    192:                else {
                    193:                        struct caller *r;
                    194:                        for (r = q->callers; r; r = r->link)
                    195:                                printf("%d\t%s\tfrom %s\tin %s:%d.%d\n", r->count, q->name, r->name,
                    196:                                        r->file, r->y, r->x + 1);
                    197:                }
                    198:                
                    199: }
                    200: 
                    201: /* string - save a copy of str, if necessary */
                    202: char *string(char *str) {
                    203:        static struct string { struct string *link; char str[1]; } *list;
                    204:        struct string *p;
                    205: 
                    206:        for (p = list; p; p = p->link)
                    207:                if (strcmp(p->str, str) == 0)
                    208:                        return p->str;
                    209:        p = (struct string *)alloc(strlen(str) + sizeof *p);
                    210:        strcpy(p->str, str);
                    211:        p->link = list;
                    212:        list = p;
                    213:        return p->str;
                    214: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.