1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
|
/* Copyright (C) 1989, 2000 Aladdin Enterprises. All rights reserved.
This software is provided AS-IS with no warranty, either express or
implied.
This software is distributed under license and may not be copied,
modified or distributed except as expressly authorized under the terms
of the license contained in the file LICENSE in this distribution.
For more information about licensing, please refer to
http://www.ghostscript.com/licensing/. For information on
commercial licensing, go to http://www.artifex.com/licensing/ or
contact Artifex Software, Inc., 101 Lucas Valley Road #110,
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
*/
/*$RCSfile$ $Revision$ */
/* Unix-specific routines for Ghostscript */
#include "pipe_.h"
#include "string_.h"
#include "time_.h"
#include "gx.h"
#include "gsexit.h"
#include "gp.h"
/*
* This is the only place in Ghostscript that calls 'exit'. Including
* <stdlib.h> is overkill, but that's where it's declared on ANSI systems.
* We don't have any way of detecting whether we have a standard library
* (some GNU compilers perversely define __STDC__ but don't provide
* an ANSI-compliant library), so we check __PROTOTYPES__ and
* hope for the best. We pick up getenv at the same time.
*/
#ifdef __PROTOTYPES__
# include <stdlib.h> /* for exit and getenv */
#else
extern void exit(P1(int));
extern char *getenv(P1(const char *));
#endif
/* Do platform-dependent initialization. */
void
gp_init(void)
{
}
/* Do platform-dependent cleanup. */
void
gp_exit(int exit_status, int code)
{
}
/* Exit the program. */
void
gp_do_exit(int exit_status)
{
}
/* ------ Miscellaneous ------ */
/* Get the string corresponding to an OS error number. */
/* Unix systems support this so inconsistently that we don't attempt */
/* to figure out whether it's available. */
const char *
gp_strerror(int errnum)
{
return NULL;
}
/* ------ Date and time ------ */
/* Read the current time (in seconds since Jan. 1, 1970) */
/* and fraction (in nanoseconds). */
void
gp_get_realtime(long *pdt)
{
struct timeval tp;
#if gettimeofday_no_timezone /* older versions of SVR4 */
{
if (gettimeofday(&tp) == -1) {
lprintf("Ghostscript: gettimeofday failed!\n");
tp.tv_sec = tp.tv_usec = 0;
}
}
#else /* All other systems */
{
struct timezone tzp;
if (gettimeofday(&tp, &tzp) == -1) {
lprintf("Ghostscript: gettimeofday failed!\n");
tp.tv_sec = tp.tv_usec = 0;
}
}
#endif
/* tp.tv_sec is #secs since Jan 1, 1970 */
pdt[0] = tp.tv_sec;
/* Some Unix systems (e.g., Interactive 3.2 r3.0) return garbage */
/* in tp.tv_usec. Try to filter out the worst of it here. */
pdt[1] = tp.tv_usec >= 0 && tp.tv_usec < 1000000 ? tp.tv_usec * 1000 : 0;
#ifdef DEBUG_CLOCK
printf("tp.tv_sec = %d tp.tv_usec = %d pdt[0] = %ld pdt[1] = %ld\n",
tp.tv_sec, tp.tv_usec, pdt[0], pdt[1]);
#endif
}
/* Read the current user CPU time (in seconds) */
/* and fraction (in nanoseconds). */
void
gp_get_usertime(long *pdt)
{
#if use_times_for_usertime
struct tms tms;
long ticks;
const long ticks_per_sec = CLK_TCK;
times(&tms);
ticks = tms.tms_utime + tms.tms_stime + tms.tms_cutime + tms.tms_cstime;
pdt[0] = ticks / ticks_per_sec;
pdt[1] = (ticks % ticks_per_sec) * (1000000000 / ticks_per_sec);
#else
gp_get_realtime(pdt); /* Use an approximation on other hosts. */
#endif
}
/* ------ Screen management ------ */
/* Get the environment variable that specifies the display to use. */
const char *
gp_getenv_display(void)
{
return getenv("DISPLAY");
}
/* ------ Printer accessing ------ */
/* Open a connection to a printer. See gp.h for details. */
FILE *
gp_open_printer(char fname[gp_file_name_sizeof], int binary_mode)
{
const char *fmode = (binary_mode ? "wb" : "w");
return (strlen(fname) == 0 ? 0 : fopen(fname, fmode));
}
/* Close the connection to the printer. */
void
gp_close_printer(FILE * pfile, const char *fname)
{
if (fname[0] == '|')
pclose(pfile);
else
fclose(pfile);
}
|