You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- 02111-1307, USA. */
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA. */
#include <config.h>
#include <errno.h>
#include <limits.h>
#include <stdlib.h>
+#include <time.h>
#if HAVE_UNISTD_H
#include <unistd.h>
#endif
-#if TIME_WITH_SYS_TIME
-#include <sys/time.h>
-#include <time.h>
-#else
-#if HAVE_SYS_TIME_H
-#include <sys/time.h>
-#else
-#include <time.h>
-#endif
-#endif
-
#include "alloc.h"
#include "bitvector.h"
#include "error.h"
#include "filename.h"
#include "font.h"
+#include "getl.h"
#include "getline.h"
+#include "glob.h"
#include "hash.h"
#include "main.h"
#include "misc.h"
-#include "misc.h"
#include "output.h"
+#include "som.h"
#include "version.h"
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
/* FIXMEs:
optimize-text-size not implemented.
assert (this->driver_open == 0);
msg (VM (1), _("PostScript driver initializing as `%s'..."), this->name);
- this->ext = x = xmalloc (sizeof (struct ps_driver_ext));
+ this->ext = x = xmalloc (sizeof *x);
this->res = PSUS;
this->horiz = this->vert = 1;
this->width = this->length = 0;
char *beg;
beg = buf2 = fn_interp_vars (buf, ps_get_var);
len = strlen (buf2);
- while (isspace (*beg))
+ while (isspace ((unsigned char) *beg))
beg++, len--;
if (beg[len - 1] == '\n')
len--;
const char *sp;
for (sp = string; *sp; sp++)
- switch (*(unsigned char *) sp)
+ switch (*sp)
{
case 'a':
case 'f':
*dp++ = '<';
for (sp = string; *sp && dp < &dest[256]; sp++)
{
- sprintf (dp, "%02x", *(unsigned char *) sp);
+ sprintf (dp, "%02x", (unsigned char) *sp);
dp += 2;
}
return stpcpy (dp, ">cvn");
dp = stpcpy (dp, "\\(");
else if (*sp == ')')
dp = stpcpy (dp, "\\)");
- else if (*sp < 32 || *((unsigned char *) sp) > 127)
+ else if (*sp < 32 || (unsigned char) *sp > 127)
dp = spprintf (dp, "\\%3o", *sp);
else
*dp++ = *sp;
draw_headers (this);
}
+ this->cp_y = 0;
+
return !ferror (x->file.file);
}
this->page_open = 0;
return !ferror (x->file.file);
}
+
+static void
+ps_submit (struct outp_driver *this UNUSED, struct som_entity *s)
+{
+ switch (s->type)
+ {
+ case SOM_CHART:
+ break;
+ default:
+ assert(0);
+ break;
+ }
+}
\f
/* Lines. */
if ((*f)->ndep >= (*f)->mdep)
{
(*f)->mdep += 16;
- *f = xrealloc (*f, (sizeof **f + sizeof (int[2]) * ((*f)->mdep - 1)));
+ *f = xrealloc (*f, sizeof **f + sizeof (int[2]) * ((*f)->mdep - 1));
}
(*f)->dep[(*f)->ndep][0] = dep1;
(*f)->dep[(*f)->ndep][1] = dep2;
int rh_width;
char buf[128];
- sprintf (buf, _("%s - Page %d"), curdate, ext->page_number);
+ sprintf (buf, _("%s - Page %d"), get_start_date (), ext->page_number);
rh_width = text_width (this, buf);
out_text_plain (this, buf, this->width - this->prop_em_width - rh_width,
if (TEST_BIT (literal_chars[ext->data], cp->ch))
*lp++ = cp->ch;
else
- switch (cp->ch)
+ switch ((char) cp->ch)
{
case '(':
lp = stpcpy (lp, "\\(");
}
else
{
- buf = xrealloc (buf, sizeof *buf * buf_len * 2);
+ buf = xnrealloc (buf, buf_len * 2, sizeof *buf);
buf_loc = buf + buf_len;
buf_end = buf + buf_len * 2;
}
return fe;
}
+static void
+ps_chart_initialise (struct outp_driver *this UNUSED, struct chart *ch)
+{
+#ifdef NO_CHARTS
+ ch->lp = NULL;
+#else
+ struct ps_driver_ext *x = this->ext;
+ char page_size[128];
+ int size;
+ int x_origin, y_origin;
+
+ ch->file = tmpfile ();
+ if (ch->file == NULL)
+ {
+ ch->lp = NULL;
+ return;
+ }
+
+ size = this->width < this->length ? this->width : this->length;
+ x_origin = x->left_margin + (size - this->width) / 2;
+ y_origin = x->bottom_margin + (size - this->length) / 2;
+
+ snprintf (page_size, sizeof page_size,
+ "a,xsize=%.3f,ysize=%.3f,xorigin=%.3f,yorigin=%.3f",
+ (double) size / PSUS, (double) size / PSUS,
+ (double) x_origin / PSUS, (double) y_origin / PSUS);
+
+ ch->pl_params = pl_newplparams ();
+ pl_setplparam (ch->pl_params, "PAGESIZE", page_size);
+ ch->lp = pl_newpl_r ("ps", NULL, ch->file, stderr, ch->pl_params);
+#endif
+}
+
+static void
+ps_chart_finalise (struct outp_driver *this UNUSED, struct chart *ch UNUSED)
+{
+#ifndef NO_CHARTS
+ struct ps_driver_ext *x = this->ext;
+ char buf[BUFSIZ];
+ static int doc_num = 0;
+
+ if (this->page_open)
+ {
+ this->class->close_page (this);
+ this->page_open = 0;
+ }
+ this->class->open_page (this);
+ fprintf (x->file.file,
+ "/sp save def%s"
+ "%d %d translate 1000 dup scale%s"
+ "userdict begin%s"
+ "/showpage { } def%s"
+ "0 setgray 0 setlinecap 1 setlinewidth%s"
+ "0 setlinejoin 10 setmiterlimit [ ] 0 setdash newpath clear%s"
+ "%%%%BeginDocument: %d%s",
+ x->eol,
+ -x->left_margin, -x->bottom_margin, x->eol,
+ x->eol,
+ x->eol,
+ x->eol,
+ x->eol,
+ doc_num++, x->eol);
+
+ rewind (ch->file);
+ while (fwrite (buf, 1, fread (buf, 1, sizeof buf, ch->file), x->file.file))
+ continue;
+ fclose (ch->file);
+
+ fprintf (x->file.file,
+ "%%%%EndDocument%s"
+ "end%s"
+ "sp restore%s",
+ x->eol,
+ x->eol,
+ x->eol);
+ this->class->close_page (this);
+ this->page_open = 0;
+#endif
+}
+
/* PostScript driver class. */
struct outp_class postscript_class =
{
ps_open_page,
ps_close_page,
- NULL,
+ ps_submit,
ps_line_horz,
ps_line_vert,
ps_text_metrics,
ps_text_draw,
- NULL,
- NULL
+ ps_chart_initialise,
+ ps_chart_finalise
};
/* EPSF driver class. FIXME: Probably doesn't work right. */
ps_open_page,
ps_close_page,
- NULL,
+ ps_submit,
ps_line_horz,
ps_line_vert,
ps_text_metrics,
ps_text_draw,
- NULL,
- NULL
+ ps_chart_initialise,
+ ps_chart_finalise
+
};
#endif /* NO_POSTSCRIPT */