diff src/readpstlog.c @ 36:6fe121a971c9 stable-0-5-7

valgrind fixes
author carl
date Thu, 09 Aug 2007 15:46:34 -0700
parents c508ee15dfca
children f6db1f060a95
line wrap: on
line diff
--- a/src/readpstlog.c	Sun Jul 15 14:25:34 2007 -0700
+++ b/src/readpstlog.c	Thu Aug 09 15:46:34 2007 -0700
@@ -20,191 +20,230 @@
 int is_in(int a, int *b, int c);
 
 int main(int argc, char** argv) {
-  int *i=NULL, x, ptr, stop=0, flag;  
-  char *fname, *buf, format, rec_type;
-  unsigned char version;
-  int *show_type=NULL, show_size=0;
-  int *ex_type=NULL, ex_size=0;
-  unsigned int funcname, filename, text, end, dtype, line, c;
-  FILE *fp;
-  struct _debug_file_rec_m mfile_rec;
-  struct _debug_file_rec_l lfile_rec;
+	int level = 0;
+	int *i=NULL, x, ptr, stop=0, flag;
+	char *fname, *buf, rec_type;
+	unsigned char version;
+	int *show_type=NULL, show_size=0;
+	int *ex_type=NULL, ex_size=0;
+	unsigned int funcname, filename, text, end, dtype, line, c;
+	FILE *fp;
+	struct _debug_file_rec_m mfile_rec;
+	struct _debug_file_rec_l lfile_rec;
+	char format = 'D';  // default
+	while ((c = getopt(argc, argv, "f:t:x:")) != -1) {
+		switch(c) {
+			case 'f':
+				// change the output format
+				format = toupper(optarg[0]);
+				break;
+			case 't':
+				//change the type of statements shown
+				show_size = split_args(optarg, &show_type);
+				//		type = atoi(optarg);
+				break;
+			case 'x':
+				// change the type of statements excluded
+				ex_size = split_args(optarg, &ex_type);
+				break;
+		}
+	}
+	if (argc > optind) {
+		fname = argv[optind++];
+	} else {
+		usage();
+		exit(2);
+	}
 
-  while ((c = getopt(argc, argv, "f:t:x:")) != -1) {
-    switch(c) {
-    case 'f':
-      // change the output format
-      format = toupper(optarg[0]);
-      break;
-    case 't':
-      //change the type of statements shown
-      show_size = split_args(optarg, &show_type);
-      //      type = atoi(optarg);
-      break;
-    case 'x':
-      // change the type of statements excluded
-      ex_size = split_args(optarg, &ex_type);
-      break;
-    }
-  }
-  if (argc > optind) {
-    fname = argv[optind++];
-  } else {
-    usage();
-    exit(2);
-  }
+	fp = fopen(fname, "rb");
+	if (fp == NULL) {
+		printf("Error. couldn't open debug file\n");
+		return 2;
+	}
+	if (get(&version, sizeof(char), 1, fp)==0) {
+		printf("Error. could not read version byte from front of file");
+		return 3;
+	}
 
-  fp = fopen(fname, "rb");
-  if (fp == NULL) {
-    printf("Error. couldn't open debug file\n");
-    return 2;
-  }
-  if (get(&version, sizeof(char), 1, fp)==0) {
-    printf("Error. could not read version byte from front of file");
-    return 3;
-  }
+	if (version > DEBUG_VERSION) {
+		printf("Version number is higher than the format I know about.");
+		return 4;
+	}
 
-  if (version > DEBUG_VERSION) {
-    printf("Version number is higher than the format I know about.");
-    return 4;
-  }
-
-  buf = (char*) xmalloc(BUF_SIZE);
+	buf = (char*) xmalloc(BUF_SIZE);
 
-  while (!stop) {
-    if (fread(&x, sizeof(int), 1, fp)<=0) {
-      break;
-    }
-    ptr = 0;
-    if (x > 0) {
-      if (i != NULL)
-        free(i);
-      i = (int*)xmalloc(sizeof(int)*(x+1));
-      // plus 1 cause we want to read the offset of the next index
-      if (get(i, sizeof(int), x+1, fp)==0) {
-	// we have reached the end of the debug file
-	printf("oh dear. we must now end\n");
-	break;
-      }
-      while (ptr < x) {
-	fseek(fp,i[ptr++], SEEK_SET);
-        get(&rec_type, 1, sizeof(char), fp);
-        if (rec_type == 'L') {
-          get(&lfile_rec, sizeof(lfile_rec), 1, fp);
-          funcname=lfile_rec.funcname;
-          filename=lfile_rec.filename;
-          text = lfile_rec.text;
-          end = lfile_rec.end;
-          dtype = lfile_rec.type;
-          line = lfile_rec.line;
-        } else if (rec_type == 'M') {
-	  get(&mfile_rec, sizeof(mfile_rec), 1, fp);
-          funcname = mfile_rec.funcname;
-          filename = mfile_rec.filename;
-          text = mfile_rec.text;
-          end = mfile_rec.end;
-          dtype = mfile_rec.type;
-          line = mfile_rec.line;
-        }
-	if ((show_type == NULL || is_in(dtype, show_type, show_size))
-	    && (ex_type == NULL || !is_in(dtype, ex_type, ex_size))) {
-	  c = 0; flag = 0;
-	  while (c < end) {
-	    if (c + (BUF_SIZE-1) < end) {
-	      get(buf, 1, BUF_SIZE-1, fp);
-	      buf[BUF_SIZE-1] = '\0';
-	      c += BUF_SIZE-1;
-	    } else {
-	      get(buf, 1, end-c, fp);
-	      buf[end-c] = '\0';
-	      c = end;
-	    }
-	    if (flag == 0) {
-	      if (format=='T') { // text format
-                printf("%s[%d]: %s", &buf[funcname], line, &buf[text]);
-	      } else {
-		printf("Type: %d\nFile[line]: %s[%d]\nFunction:%s\nText:%s", dtype, 
-		       &buf[filename], line, &buf[funcname], &buf[text]);
-	      }
-	      flag = 1;
-	    } else {
-	      printf("%s", buf);
-	    }
-	  }
-	  printf("\n");
+	while (!stop) {
+		if (fread(&x, sizeof(int), 1, fp)<=0) break;
+		ptr = 0;
+		if (x > 0) {
+			if (i) free(i);
+			i = (int*)xmalloc(sizeof(int)*(x+1));
+			// plus 1 cause we want to read the offset of the next index
+			if (get(i, sizeof(int), x+1, fp)==0) {
+				// we have reached the end of the debug file
+				printf("oh dear. we must now end\n");
+				break;
+			}
+			while (ptr < x) {
+				fseek(fp,i[ptr++], SEEK_SET);
+				get(&rec_type, 1, sizeof(char), fp);
+				if (rec_type == 'L') {
+					get(&lfile_rec, sizeof(lfile_rec), 1, fp);
+					funcname=lfile_rec.funcname;
+					filename=lfile_rec.filename;
+					text = lfile_rec.text;
+					end = lfile_rec.end;
+					dtype = lfile_rec.type;
+					line = lfile_rec.line;
+				} else if (rec_type == 'M') {
+					get(&mfile_rec, sizeof(mfile_rec), 1, fp);
+					funcname = mfile_rec.funcname;
+					filename = mfile_rec.filename;
+					text = mfile_rec.text;
+					end = mfile_rec.end;
+					dtype = mfile_rec.type;
+					line = mfile_rec.line;
+				}
+				if (dtype == DEBUG_FUNCENT_NO) level++;
+				if ((show_type == NULL || is_in(dtype, show_type, show_size)) &&
+					(ex_type == NULL   || !is_in(dtype, ex_type, ex_size))) {
+					c = 0; flag = 0;
+					while (c < end) {
+						int ii = (level-1) * 4;
+						if (ii < 0) ii = 0;
+						if (ii > 64) ii = 64;
+						char indent[ii+1];
+						memset(indent, ' ', ii);
+						indent[ii] = '\0';
+						if (c + (BUF_SIZE-1) < end) {
+							get(buf, 1, BUF_SIZE-1, fp);
+							buf[BUF_SIZE-1] = '\0';
+							c += BUF_SIZE-1;
+						} else {
+							get(buf, 1, end-c, fp);
+							buf[end-c] = '\0';
+							c = end;
+						}
+						if (flag == 0) {
+							if (format == 'I') { // indented text format
+								char *b = buf+text;
+								printf("%s %s/%s[%d]: ", indent, &buf[filename], &buf[funcname], line);
+								while (b) {
+									char *p = strchr(b, '\n');
+									if (p) {
+										*p = '\0';
+										printf("%s\n%s ", b, indent);
+										b = p + 1;
+									}
+									else {
+										printf("%s", b);
+										b = NULL;
+									}
+								}
+							}
+							else if (format == 'T') { // text format
+								printf("%s/%s[%d]: %s", &buf[filename], &buf[funcname], line, &buf[text]);
+							} else {
+								printf("Type: %d\nFile[line]: %s[%d]\nFunction:%s\nText:%s", dtype,
+									   &buf[filename], line, &buf[funcname], &buf[text]);
+							}
+							flag = 1;
+						} else {
+							if (format == 'I') {
+								char *b = buf;
+								while (b) {
+									char *p = strchr(b, '\n');
+									if (p) {
+										*p = '\0';
+										printf("%s\n%s ", b, indent);
+										b = p + 1;
+									}
+									else {
+										printf("%s", b);
+										b = NULL;
+									}
+								}
+							}
+							else printf("%s", buf);
+						}
+					}
+					printf("\n");
+				}
+				if (dtype == DEBUG_FUNCRET_NO) level--;
+			}
+			if (fseek(fp, i[ptr], SEEK_SET)==-1) {
+				printf("finished\n");
+				break;
+			}
+		} else {
+			printf("...no more items\n");
+			break;
+		}
 	}
-      }
-      if (fseek(fp, i[ptr], SEEK_SET)==-1) {
-	printf("finished\n");
-	break;
-      }
-    } else {
-      printf("...no more items\n");
-      break;
-    }
-  }
-  free(buf);
-  fclose(fp);
-  return 0;
+	free(buf);
+	fclose(fp);
+	return 0;
 }
-    
+
 size_t get(void * buf, int size, unsigned int  count, FILE *fp) {
-  size_t z;
-  if ((z=fread(buf,size, count, fp)) < count) {
-    printf("Read Failed! (size=%d, count=%d,z=%ld)\n", size, count, (long)z);
-    exit(1);
-  }
-  return z;
+	size_t z;
+	if ((z=fread(buf,size, count, fp)) < count) {
+		printf("Read Failed! (size=%d, count=%d,z=%ld)\n", size, count, (long)z);
+		exit(1);
+	}
+	return z;
 }
 
 int usage() {
-  printf("readlog -t[show_type] -x[exclude_type] -f[format] filename\n");
-  printf("\tformat:\n\t\tt: Text log format\n");
-  printf("\tshow_type:\n\t\tcomma separated list of types to show "
-	 "[ie, 2,4,1,6]\n");
-  printf("\texclude_type:\n\t\tcomma separated list of types to exclude "
-	 "[ie, 1,5,3,7]\n");
-  return 0;
+	printf("readlog -t[show_type] -x[exclude_type] -f[format] filename\n");
+	printf("\tformat:\n\t\tt: text log format\n");
+	printf("\t\ti: indented text log format\n");
+	printf("\tshow_type:\n\t\tcomma separated list of types to show "
+	   "[ie, 2,4,1,6]\n");
+	printf("\texclude_type:\n\t\tcomma separated list of types to exclude "
+	   "[ie, 1,5,3,7]\n");
+	return 0;
 }
 
+
 int split_args(char *args, int **targ) {
-  int count = 1, *i, x, z;
-  char *tmp = args, *y;
-  if (*targ != NULL) {
-    free(*targ);
-  }
-  // find the number of tokens in the string. Starting 
-  // from 1 cause there will always be one
-  while ((tmp = strchr(tmp, ',')) != NULL) {
-    tmp++; count++;
-  }
-  *targ = (int*)xmalloc(count * sizeof(int));
-  i = *targ; // for convienience
-  tmp = args;
-  z = 0;
-  for (x = 0; x < count; x++) {
-    y = strtok(tmp, ",");
-    tmp = NULL; // must be done after first call
-    if (y != NULL) {
-      i[x] = atoi(y);
-      z++;
-    }
-  }
-  return z;
+	int count = 1, *i, x, z;
+	char *tmp = args, *y;
+	if (*targ != NULL) {
+	  free(*targ);
+	}
+	// find the number of tokens in the string. Starting
+	// from 1 cause there will always be one
+	while ((tmp = strchr(tmp, ',')) != NULL) {
+		tmp++; count++;
+	}
+	*targ = (int*)xmalloc(count * sizeof(int));
+	i = *targ; // for convienience
+	tmp = args;
+	z = 0;
+	for (x = 0; x < count; x++) {
+		y = strtok(tmp, ",");
+		tmp = NULL; // must be done after first call
+		if (y != NULL) {
+			i[x] = atoi(y);
+			z++;
+		}
+	}
+	return z;
 }
 
+
 // checks to see if the first arg is in the array of the second arg,
 // the size of which is specified with the third arg. If the second
-// arg is NULL, then it is obvious that it ain't there.
+// arg is NULL, then it is obvious that it is not there.
 int is_in(int a, int *b, int c){
-  int d = 0;
-  if (b == NULL || c == 0) { // no array or no items in array
-    return 0;
-  }
-  while (d < c) {
-    if (a == b[d])
-      return 1;
-    d++;
-  }
-  return 0;
+	int d = 0;
+	if (b == NULL || c == 0) { // no array or no items in array
+		return 0;
+	}
+	while (d < c) {
+		if (a == b[d]) return 1;
+		d++;
+	}
+	return 0;
 }