mirror of
https://github.com/Zenithsiz/ftmemsim-valgrind.git
synced 2026-02-09 05:10:23 +00:00
285 lines
7.2 KiB
C
285 lines
7.2 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 "Main.h"
|
|
#include "Defines.h"
|
|
#include "Dimensions.h"
|
|
#include "Curves.h"
|
|
#include "HpFile.h"
|
|
#include "Axes.h"
|
|
#include "Key.h"
|
|
#include "Marks.h"
|
|
#include "Utilities.h"
|
|
|
|
/* own stuff */
|
|
#include "PsFile.h"
|
|
|
|
static void Prologue PROTO((void)); /* forward */
|
|
static void Variables PROTO((void)); /* forward */
|
|
static void BorderOutlineBox PROTO((void)); /* forward */
|
|
static void BigTitleOutlineBox PROTO((void)); /* forward */
|
|
static void TitleOutlineBox PROTO((void)); /* forward */
|
|
static void BigTitleText PROTO((void)); /* forward */
|
|
static void TitleText PROTO((void)); /* forward */
|
|
|
|
void
|
|
PutPsFile()
|
|
{
|
|
Prologue();
|
|
Variables();
|
|
BorderOutlineBox();
|
|
|
|
if (bflag) {
|
|
BigTitleOutlineBox();
|
|
BigTitleText();
|
|
} else {
|
|
TitleOutlineBox();
|
|
TitleText();
|
|
}
|
|
|
|
CurvesInit();
|
|
|
|
Axes();
|
|
|
|
if (TWENTY) Key();
|
|
|
|
Curves();
|
|
|
|
if (!yflag) Marks();
|
|
|
|
fprintf(psfp, "showpage\n");
|
|
}
|
|
|
|
|
|
static void StandardSpecialComments PROTO((void)); /* forward */
|
|
static void EPSFSpecialComments PROTO((floatish)); /* forward */
|
|
static void Landscape PROTO((void)); /* forward */
|
|
static void Portrait PROTO((void)); /* forward */
|
|
static void Scaling PROTO((floatish)); /* forward */
|
|
|
|
static void
|
|
Prologue()
|
|
{
|
|
if (eflag) {
|
|
floatish epsfscale = epsfwidth / (floatish) borderwidth;
|
|
EPSFSpecialComments(epsfscale);
|
|
Scaling(epsfscale);
|
|
} else {
|
|
StandardSpecialComments();
|
|
if (gflag) Portrait(); else Landscape();
|
|
}
|
|
}
|
|
|
|
extern char *jobstring;
|
|
extern char *datestring;
|
|
|
|
static void
|
|
StandardSpecialComments()
|
|
{
|
|
fprintf(psfp, "%%!PS-Adobe-2.0\n");
|
|
fprintf(psfp, "%%%%Title: %s\n", jobstring);
|
|
fprintf(psfp, "%%%%Creator: %s (version %s)\n", programname, VERSION);
|
|
fprintf(psfp, "%%%%CreationDate: %s\n", datestring);
|
|
fprintf(psfp, "%%%%EndComments\n");
|
|
}
|
|
|
|
static void
|
|
EPSFSpecialComments(epsfscale)
|
|
floatish epsfscale;
|
|
{
|
|
fprintf(psfp, "%%!PS-Adobe-2.0\n");
|
|
fprintf(psfp, "%%%%Title: %s\n", jobstring);
|
|
fprintf(psfp, "%%%%Creator: %s (version %s)\n", programname, VERSION);
|
|
fprintf(psfp, "%%%%CreationDate: %s\n", datestring);
|
|
fprintf(psfp, "%%%%BoundingBox: 0 0 %d %d\n",
|
|
(int) (borderwidth * epsfscale + 0.5),
|
|
(int) (borderheight * epsfscale + 0.5) );
|
|
fprintf(psfp, "%%%%EndComments\n");
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
Landscape()
|
|
{
|
|
fprintf(psfp, "-90 rotate\n");
|
|
fprintf(psfp, "%f %f translate\n", -(borderwidth + (floatish) START_Y),
|
|
(floatish) START_X);
|
|
}
|
|
|
|
static void
|
|
Portrait()
|
|
{
|
|
fprintf(psfp, "%f %f translate\n", (floatish) START_X, (floatish) START_Y);
|
|
}
|
|
|
|
static void
|
|
Scaling(epsfscale)
|
|
floatish epsfscale;
|
|
{
|
|
fprintf(psfp, "%f %f scale\n", epsfscale, epsfscale);
|
|
}
|
|
|
|
|
|
static void
|
|
Variables()
|
|
{
|
|
fprintf(psfp, "/HE%d /Helvetica findfont %d scalefont def\n",
|
|
NORMAL_FONT, NORMAL_FONT);
|
|
|
|
fprintf(psfp, "/HE%d /Helvetica findfont %d scalefont def\n",
|
|
LARGE_FONT, LARGE_FONT);
|
|
}
|
|
|
|
|
|
static void
|
|
BorderOutlineBox()
|
|
{
|
|
fprintf(psfp, "newpath\n");
|
|
fprintf(psfp, "0 0 moveto\n");
|
|
fprintf(psfp, "0 %f rlineto\n", borderheight);
|
|
fprintf(psfp, "%f 0 rlineto\n", borderwidth);
|
|
fprintf(psfp, "0 %f rlineto\n", -borderheight);
|
|
fprintf(psfp, "closepath\n");
|
|
fprintf(psfp, "%f setlinewidth\n", borderthick);
|
|
fprintf(psfp, "stroke\n");
|
|
}
|
|
|
|
static void
|
|
BigTitleOutlineBox()
|
|
{
|
|
fprintf(psfp, "newpath\n");
|
|
fprintf(psfp, "%f %f moveto\n", borderspace,
|
|
borderheight - titleheight - borderspace);
|
|
fprintf(psfp, "0 %f rlineto\n", titleheight);
|
|
fprintf(psfp, "%f 0 rlineto\n", titlewidth);
|
|
fprintf(psfp, "0 %f rlineto\n", -titleheight);
|
|
fprintf(psfp, "closepath\n");
|
|
fprintf(psfp, "%f setlinewidth\n", borderthick);
|
|
fprintf(psfp, "stroke\n");
|
|
|
|
fprintf(psfp, "%f %f moveto\n", borderspace,
|
|
borderheight - titleheight / 2 - borderspace);
|
|
fprintf(psfp, "%f 0 rlineto\n", titlewidth);
|
|
fprintf(psfp, "stroke\n");
|
|
}
|
|
|
|
|
|
static void
|
|
TitleOutlineBox()
|
|
{
|
|
fprintf(psfp, "newpath\n");
|
|
fprintf(psfp, "%f %f moveto\n", borderspace,
|
|
borderheight - titleheight - borderspace);
|
|
fprintf(psfp, "0 %f rlineto\n", titleheight);
|
|
fprintf(psfp, "%f 0 rlineto\n", titlewidth);
|
|
fprintf(psfp, "0 %f rlineto\n", -titleheight);
|
|
fprintf(psfp, "closepath\n");
|
|
fprintf(psfp, "%f setlinewidth\n", borderthick);
|
|
fprintf(psfp, "stroke\n");
|
|
}
|
|
|
|
static void EscapePrint PROTO((char *, int)); /* forward */
|
|
|
|
static void
|
|
BigTitleText()
|
|
{
|
|
floatish x, y;
|
|
|
|
x = borderspace + titletextspace;
|
|
y = borderheight - titleheight / 2 - borderspace + titletextspace;
|
|
|
|
/* job identifier goes on top at the far left */
|
|
|
|
fprintf(psfp, "HE%d setfont\n", TITLE_TEXT_FONT);
|
|
fprintf(psfp, "%f %f moveto\n", x, y);
|
|
fputc('(', psfp);
|
|
EscapePrint(jobstring, BIG_JOB_STRING_WIDTH);
|
|
fprintf(psfp, ") show\n");
|
|
|
|
y = borderheight - titleheight - borderspace + titletextspace;
|
|
|
|
/* area below curve gows at the botton, far left */
|
|
|
|
fprintf(psfp, "HE%d setfont\n", TITLE_TEXT_FONT);
|
|
fprintf(psfp, "%f %f moveto\n", x, y);
|
|
fputc('(', psfp);
|
|
CommaPrint(psfp, (intish)areabelow);
|
|
fprintf(psfp, " %s x %s)\n", valueunitstring, sampleunitstring);
|
|
fprintf(psfp, "show\n");
|
|
|
|
/* date goes at far right */
|
|
|
|
fprintf(psfp, "HE%d setfont\n", TITLE_TEXT_FONT);
|
|
fprintf(psfp, "(%s)\n", datestring);
|
|
fprintf(psfp, "dup stringwidth pop\n");
|
|
fprintf(psfp, "%f\n", (titlewidth + borderspace) - titletextspace);
|
|
fprintf(psfp, "exch sub\n");
|
|
fprintf(psfp, "%f moveto\n", y);
|
|
fprintf(psfp, "show\n");
|
|
}
|
|
|
|
|
|
static void
|
|
TitleText()
|
|
{
|
|
floatish x, y;
|
|
|
|
x = borderspace + titletextspace;
|
|
y = borderheight - titleheight - borderspace + titletextspace;
|
|
|
|
/* job identifier goes at far left */
|
|
|
|
fprintf(psfp, "HE%d setfont\n", TITLE_TEXT_FONT);
|
|
fprintf(psfp, "%f %f moveto\n", x, y);
|
|
fputc('(', psfp);
|
|
EscapePrint(jobstring, SMALL_JOB_STRING_WIDTH);
|
|
fprintf(psfp, ") show\n");
|
|
|
|
/* area below curve is centered */
|
|
|
|
fprintf(psfp, "HE%d setfont\n", TITLE_TEXT_FONT);
|
|
fputc('(', psfp);
|
|
CommaPrint(psfp, (intish) areabelow);
|
|
fprintf(psfp, " %s x %s)\n", valueunitstring, sampleunitstring);
|
|
|
|
fprintf(psfp, "dup stringwidth pop\n");
|
|
fprintf(psfp, "2 div\n");
|
|
fprintf(psfp, "%f\n", titlewidth / 2);
|
|
fprintf(psfp, "exch sub\n");
|
|
fprintf(psfp, "%f moveto\n", y);
|
|
fprintf(psfp, "show\n");
|
|
|
|
/* date goes at far right */
|
|
|
|
fprintf(psfp, "HE%d setfont\n", TITLE_TEXT_FONT);
|
|
fprintf(psfp, "(%s)\n", datestring);
|
|
fprintf(psfp, "dup stringwidth pop\n");
|
|
fprintf(psfp, "%f\n", (titlewidth + borderspace) - titletextspace);
|
|
fprintf(psfp, "exch sub\n");
|
|
fprintf(psfp, "%f moveto\n", y);
|
|
fprintf(psfp, "show\n");
|
|
}
|
|
|
|
/*
|
|
* Print a string s in width w, escaping characters where necessary.
|
|
*/
|
|
|
|
static void
|
|
EscapePrint(s,w)
|
|
char* s; int w;
|
|
{
|
|
for ( ; *s && w > 0; s++, w--) {
|
|
if (*s == '(') { /* escape required */
|
|
fputc('\\', psfp);
|
|
} else if (*s == ')') {
|
|
fputc('\\', psfp);
|
|
}
|
|
|
|
fputc(*s, psfp);
|
|
}
|
|
}
|