mirror of
https://github.com/Zenithsiz/ftmemsim-valgrind.git
synced 2026-02-08 21:09:49 +00:00
258 lines
5.1 KiB
C
258 lines
5.1 KiB
C
/* This file is part of hp2ps, a graph drawer for memory profiles.
|
|
Copyright (C) 2002 The University Court of the University of Glasgow.
|
|
This program is governed by the license contained in the file LICENSE. */
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include "Main.h"
|
|
#include "Defines.h"
|
|
#include "AuxFile.h"
|
|
#include "AreaBelow.h"
|
|
#include "Dimensions.h"
|
|
#include "HpFile.h"
|
|
#include "PsFile.h"
|
|
#include "Reorder.h"
|
|
#include "Scale.h"
|
|
#include "TopTwenty.h"
|
|
#include "TraceElement.h"
|
|
#include "Deviation.h"
|
|
#include "Error.h"
|
|
#include "Utilities.h"
|
|
|
|
boolish pflag = 0; /* read auxiliary file */
|
|
boolish eflag = 0; /* scaled EPSF */
|
|
boolish dflag = 0; /* sort by standard deviation */
|
|
int iflag = 0; /* sort by identifier (3-way flag) */
|
|
boolish gflag = 0; /* output suitable for previewer */
|
|
boolish yflag = 0; /* ignore marks */
|
|
boolish bflag = 0; /* use a big title box */
|
|
boolish sflag = 0; /* use a small title box */
|
|
int mflag = 0; /* max no. of bands displayed (default 20) */
|
|
boolish tflag = 0; /* ignored threshold specified */
|
|
boolish cflag = 0; /* colour output */
|
|
|
|
boolish filter; /* true when running as a filter */
|
|
|
|
static floatish WidthInPoints PROTO((char *)); /* forward */
|
|
static FILE *Fp PROTO((char *, char **, char *, char *)); /* forward */
|
|
|
|
char *hpfile;
|
|
char *psfile;
|
|
char *auxfile;
|
|
|
|
char *programname;
|
|
|
|
static char *pathName;
|
|
static char *baseName; /* "basename" is a std C library name (sigh) */
|
|
|
|
FILE* hpfp;
|
|
FILE* psfp;
|
|
FILE* auxfp;
|
|
|
|
floatish xrange = 0.0;
|
|
floatish yrange = 0.0;
|
|
|
|
floatish auxxrange = 0.0;
|
|
floatish auxyrange = 0.0;
|
|
|
|
floatish epsfwidth;
|
|
floatish areabelow;
|
|
|
|
intish nsamples;
|
|
intish nmarks;
|
|
intish nidents;
|
|
|
|
floatish THRESHOLD_PERCENT = DEFAULT_THRESHOLD;
|
|
int TWENTY = DEFAULT_TWENTY;
|
|
|
|
int main(argc, argv)
|
|
int argc;
|
|
char* argv[];
|
|
{
|
|
|
|
programname = copystring(Basename(argv[0]));
|
|
|
|
argc--, argv++;
|
|
while (argc && argv[0][0] == '-') {
|
|
while (*++*argv)
|
|
switch(**argv) {
|
|
case 'p':
|
|
pflag++;
|
|
break;
|
|
case 'e':
|
|
eflag++;
|
|
epsfwidth = WidthInPoints(*argv + 1);
|
|
goto nextarg;
|
|
case 'd':
|
|
dflag++;
|
|
goto nextarg;
|
|
case 'i':
|
|
switch( *(*argv + 1) ) {
|
|
case '-':
|
|
iflag = -1;
|
|
case '+':
|
|
default:
|
|
iflag = 1;
|
|
}
|
|
goto nextarg;
|
|
case 'g':
|
|
gflag++;
|
|
goto nextarg;
|
|
case 'y':
|
|
yflag++;
|
|
goto nextarg;
|
|
case 'b':
|
|
bflag++;
|
|
goto nextarg;
|
|
case 's':
|
|
sflag++;
|
|
goto nextarg;
|
|
case 'm':
|
|
mflag++;
|
|
TWENTY = atoi(*argv + 1);
|
|
if (TWENTY > DEFAULT_TWENTY)
|
|
Usage(*argv-1);
|
|
goto nextarg;
|
|
case 't':
|
|
tflag++;
|
|
THRESHOLD_PERCENT = (floatish) atof(*argv + 1);
|
|
if (THRESHOLD_PERCENT < 0 || THRESHOLD_PERCENT > 5)
|
|
Usage(*argv-1);
|
|
goto nextarg;
|
|
case 'c':
|
|
cflag++;
|
|
goto nextarg;
|
|
case '?':
|
|
default:
|
|
Usage(*argv-1);
|
|
}
|
|
nextarg: ;
|
|
argc--, argv++;
|
|
}
|
|
|
|
hpfile = "stdin";
|
|
psfile = "stdout";
|
|
|
|
hpfp = stdin;
|
|
psfp = stdout;
|
|
|
|
filter = argc < 1;
|
|
|
|
|
|
|
|
if (!filter) {
|
|
pathName = copystring(argv[0]);
|
|
DropSuffix(pathName, ".hp");
|
|
baseName = copystring(Basename(pathName));
|
|
|
|
hpfp = Fp(pathName, &hpfile, ".hp", "r");
|
|
psfp = Fp(baseName, &psfile, ".ps", "w");
|
|
|
|
if (pflag) auxfp = Fp(baseName, &auxfile, ".aux", "r");
|
|
}
|
|
|
|
GetHpFile(hpfp);
|
|
|
|
if (!filter && pflag) GetAuxFile(auxfp);
|
|
|
|
|
|
TraceElement(); /* Orders on total, Removes trace elements (tflag) */
|
|
|
|
if (dflag) Deviation(); /* ReOrders on deviation */
|
|
|
|
if (iflag) Identorder(iflag); /* ReOrders on identifier */
|
|
|
|
if (pflag) Reorder(); /* ReOrders on aux file */
|
|
|
|
if (TWENTY) TopTwenty(); /* Selects top twenty (mflag) */
|
|
|
|
Dimensions();
|
|
|
|
areabelow = AreaBelow();
|
|
|
|
Scale();
|
|
|
|
PutPsFile();
|
|
|
|
if (!filter) {
|
|
auxfp = Fp(baseName, &auxfile, ".aux", "w");
|
|
PutAuxFile(auxfp);
|
|
}
|
|
|
|
return(0);
|
|
}
|
|
|
|
|
|
|
|
typedef enum {POINTS, INCHES, MILLIMETRES} pim;
|
|
|
|
static pim Units PROTO((char *)); /* forward */
|
|
|
|
static floatish
|
|
WidthInPoints(wstr)
|
|
char *wstr;
|
|
{
|
|
floatish result;
|
|
|
|
result = (floatish) atof(wstr);
|
|
|
|
switch (Units(wstr)) {
|
|
case INCHES:
|
|
result *= 72.0;
|
|
break;
|
|
case MILLIMETRES:
|
|
result *= 2.834646;
|
|
break;
|
|
case POINTS:
|
|
default: ;
|
|
}
|
|
|
|
if (result <= 144) /* Minimum of 2in wide ! */
|
|
Usage(wstr);
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
static pim
|
|
Units(wstr)
|
|
char* wstr;
|
|
{
|
|
int i;
|
|
|
|
i = strlen(wstr) - 2;
|
|
|
|
if (wstr[i] == 'p' && wstr[i+1] == 't') {
|
|
return POINTS;
|
|
} else if (wstr[i] == 'i' && wstr[i+1] == 'n') {
|
|
return INCHES;
|
|
} else if (wstr[i] == 'm' && wstr[i+1] == 'm') {
|
|
return MILLIMETRES;
|
|
} else {
|
|
return POINTS;
|
|
}
|
|
}
|
|
|
|
static FILE *
|
|
Fp(rootname, filename, suffix, mode)
|
|
char* rootname; char** filename; char* suffix; char* mode;
|
|
{
|
|
*filename = copystring2(rootname, suffix);
|
|
|
|
return(OpenFile(*filename, mode));
|
|
}
|
|
|
|
#ifdef DEBUG
|
|
void
|
|
_stgAssert (filename, linenum)
|
|
char *filename;
|
|
unsigned int linenum;
|
|
{
|
|
fflush(stdout);
|
|
fprintf(stderr, "ASSERTION FAILED: file %s, line %u\n", filename, linenum);
|
|
fflush(stderr);
|
|
abort();
|
|
}
|
|
#endif
|