|
|
1.1 ! root 1: #ifdef BPRINT ! 2: #define dclproto(func,args) func args; ! 3: #else ! 4: #include "c.h" ! 5: #define FILE int ! 6: #define EOF -1 ! 7: #endif ! 8: ! 9: /* ! 10: * read prof.out; format: ! 11: * #files ! 12: * name ! 13: * ... (#files-1 times) ! 14: * #functions ! 15: * name file# x y count ! 16: * ... (#functions-1 times) ! 17: * #points ! 18: * file# x y count ! 19: * ... (#points-1 times) ! 20: */ ! 21: ! 22: struct file { ! 23: struct file *link; ! 24: char *name; ! 25: int size, count; ! 26: struct count { ! 27: int x, y; ! 28: int count; ! 29: } *counts; ! 30: struct func { ! 31: struct func *link; ! 32: char *name; ! 33: struct count count; ! 34: } *funcs; ! 35: } *filelist; ! 36: ! 37: dclproto(static void afunction,(char *, char *, int, int, int)) ! 38: dclproto(static void apoint,(int, char *, int, int, int)) ! 39: dclproto(static struct file *findfile,(char *)) ! 40: dclproto(static int gather,(FILE *)) ! 41: ! 42: #ifdef BPRINT ! 43: /* alloc - allocate n bytes or die */ ! 44: static char *alloc(int n) { ! 45: char *new = (char *)malloc(n); ! 46: ! 47: assert(new); ! 48: return new; ! 49: } ! 50: ! 51: /* string - save a copy of str, if necessary */ ! 52: char *string(char *str) { ! 53: static struct string { char *str; struct string *link; } *list; ! 54: struct string *p; ! 55: ! 56: for (p = list; p; p = p->link) ! 57: if (strcmp(p->str, str) == 0) ! 58: return p->str; ! 59: p = (struct string *)alloc(sizeof *p); ! 60: p->str = strcpy((char *)alloc(strlen(str) + 1), str); ! 61: p->link = list; ! 62: list = p; ! 63: return p->str; ! 64: } ! 65: #else ! 66: dclproto(extern void qsort,(struct count *, int, int, int (*)(const void *, const void *))) ! 67: dclproto(static int fscanf,(FILE *, char *, Generic, Generic, Generic, Generic, Generic)) ! 68: dclproto(extern int sscanf,(char *, char *, Generic, Generic, Generic, Generic, Generic)) ! 69: ! 70: /* fscanf - read a line of input according to fmt */ ! 71: static int fscanf(fp, fmt, a1, a2, a3, a4, a5) FILE *fp; char *fmt; Generic a1, a2, a3, a4, a5; { ! 72: &fp; ! 73: while (*cp) { ! 74: if (limit - cp < MAXTOKEN) ! 75: fillbuf(); ! 76: sscanf(cp, fmt, a1, a2, a3, a4, a5); ! 77: while (*cp && *cp != '\n') ! 78: cp++; ! 79: if (*cp == '\n') { ! 80: cp++; ! 81: nextline(); ! 82: } ! 83: return 0; ! 84: } ! 85: return EOF; ! 86: } ! 87: #endif ! 88: ! 89: /* afunction - add function name and its data to file's function list */ ! 90: static void afunction(name, file, x, y, count) char *name, *file; { ! 91: struct file *p = findfile(file); ! 92: struct func **q; ! 93: ! 94: assert(p); ! 95: for (q = &p->funcs; *q && name != (*q)->name; q = &(*q)->link) ! 96: ; ! 97: if (*q == 0) { ! 98: *q = (struct func *)alloc(sizeof **q); ! 99: (*q)->name = name; ! 100: (*q)->count.x = x; ! 101: (*q)->count.y = y; ! 102: (*q)->count.count = 0; ! 103: (*q)->link = 0; ! 104: } ! 105: (*q)->count.count += count; ! 106: } ! 107: ! 108: /* apoint - append execution point i to file's data */ ! 109: static void apoint(i, file, x, y, count) char *file; { ! 110: struct file *p = findfile(file); ! 111: ! 112: assert(p); ! 113: if (i >= p->size) { ! 114: int j; ! 115: if (p->size == 0) { ! 116: p->counts = (struct count *)alloc(200*sizeof(struct count)); ! 117: p->size = 200; ! 118: } else { ! 119: #ifdef BPRINT ! 120: p->counts = (struct count *)realloc(p->counts, 2*p->size*sizeof(struct count)); ! 121: #else ! 122: struct count *new = (struct count *)alloc(2*p->size*sizeof(struct count)); ! 123: for (j = 0; j < p->count; j++) ! 124: new[j] = p->counts[j]; ! 125: p->counts = new; ! 126: #endif ! 127: p->size = 2*p->size; ! 128: } ! 129: for (j = p->count; j < p->size; j++) { ! 130: static struct count z; ! 131: p->counts[j] = z; ! 132: } ! 133: } ! 134: p->counts[i].x = x; ! 135: p->counts[i].y = y; ! 136: p->counts[i].count += count; ! 137: if (i >= p->count) ! 138: p->count = i + 1; ! 139: } ! 140: ! 141: /* compare - return <0, 0, >0 if a<b, a==b, a>b, resp. */ ! 142: static int compare(a, b) struct count *a, *b; { ! 143: if (a->y == b->y) ! 144: return a->x - b->x; ! 145: return a->y - b->y; ! 146: } ! 147: ! 148: /* findcount - return count associated with (file,x,y) or -1 */ ! 149: int findcount(file, x, y) char *file; { ! 150: static struct file *cursor; ! 151: ! 152: if (cursor == 0 || cursor->name != file) ! 153: cursor = findfile(file); ! 154: if (cursor) { ! 155: int l, u; ! 156: struct count *c = cursor->counts; ! 157: for (l = 0, u = cursor->count - 1; l <= u; ) { ! 158: int k = (l + u)/2; ! 159: if (c[k].y > y || c[k].y == y && c[k].x > x) ! 160: u = k - 1; ! 161: else if (c[k].y < y || c[k].y == y && c[k].x < x) ! 162: l = k + 1; ! 163: else ! 164: return c[k].count; ! 165: } ! 166: } ! 167: return -1; ! 168: } ! 169: ! 170: /* findfile - return file name's file list entry, or 0 */ ! 171: static struct file *findfile(name) char *name; { ! 172: struct file *p; ! 173: ! 174: for (p = filelist; p; p = p->link) ! 175: if (p->name == name) ! 176: return p; ! 177: return 0; ! 178: } ! 179: ! 180: /* findfunc - return count associated with function name in file or -1 */ ! 181: int findfunc(name, file) char *name, *file; { ! 182: static struct file *cursor; ! 183: ! 184: if (cursor == 0 || cursor->name != file) ! 185: cursor = findfile(file); ! 186: if (cursor) { ! 187: struct func *p; ! 188: for (p = cursor->funcs; p; p = p->link) ! 189: if (p->name == name) ! 190: return p->count.count; ! 191: } ! 192: return -1; ! 193: } ! 194: ! 195: /* gather - read prof.out data from fd */ ! 196: static int gather(FILE *fp) { ! 197: int i, nfiles, nfuncs, npoints; ! 198: char *files[64], buf[120]; ! 199: ! 200: if (fscanf(fp, "%d\n", &nfiles, 0, 0, 0, 0) == EOF) ! 201: return 0; ! 202: assert(nfiles < sizeof files/sizeof files[0]); ! 203: for (i = 0; i < nfiles; i++) { ! 204: fscanf(fp, "%s\n", buf, 0, 0, 0, 0); ! 205: files[i] = string(buf); ! 206: if (!findfile(files[i])) { ! 207: struct file *new = (struct file *)alloc(sizeof *new); ! 208: new->name = files[i]; ! 209: new->size = new->count = 0; ! 210: new->counts = 0; ! 211: new->funcs = 0; ! 212: new->link = filelist; ! 213: filelist = new; ! 214: } ! 215: } ! 216: fscanf(fp, "%d\n", &nfuncs, 0, 0, 0, 0); ! 217: for (i = 0; i < nfuncs; i++) { ! 218: int f, x, y, count; ! 219: fscanf(fp, "%s %d %d %d %d\n", buf, &f, &x, &y, &count); ! 220: afunction(string(buf), files[f-1], x, y, count); ! 221: } ! 222: fscanf(fp, "%d\n", &npoints, 0, 0, 0, 0); ! 223: for (i = 0; i < npoints; i++) { ! 224: int f, x, y, count; ! 225: fscanf(fp, "%d %d %d %d\n", &f, &x, &y, &count, 0); ! 226: if (f) ! 227: apoint(i, files[f-1], x, y, count); ! 228: } ! 229: return 1; ! 230: } ! 231: ! 232: /* process - read prof.out data from file */ ! 233: int process(file) char *file; { ! 234: struct file *p; ! 235: FILE *fp; ! 236: ! 237: #ifdef BPRINT ! 238: if ((fp = fopen(file, "r"))) { ! 239: while (gather(fp)) ! 240: ; ! 241: fclose(fp); ! 242: #else ! 243: int fd; ! 244: if ((fd = open(file, 0)) >= 0) { ! 245: inputInit(fd); ! 246: while (gather(fp)) ! 247: ; ! 248: close(fd); ! 249: #endif ! 250: for (p = filelist; p; p = p->link) ! 251: qsort(p->counts, p->count, sizeof *p->counts, ! 252: #ifdef PROTO ! 253: (int (*)(const void *, const void *)) ! 254: #endif ! 255: compare); ! 256: return 1; ! 257: } ! 258: return 0; ! 259: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.