xref: /plan9/sys/src/cmd/gs/src/gp_unix.c (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
1*593dc095SDavid du Colombier /* Copyright (C) 1989-2003 artofcode LLC. All rights reserved.
27dd7cddfSDavid du Colombier 
3*593dc095SDavid du Colombier   This software is provided AS-IS with no warranty, either express or
4*593dc095SDavid du Colombier   implied.
57dd7cddfSDavid du Colombier 
6*593dc095SDavid du Colombier   This software is distributed under license and may not be copied,
7*593dc095SDavid du Colombier   modified or distributed except as expressly authorized under the terms
8*593dc095SDavid du Colombier   of the license contained in the file LICENSE in this distribution.
97dd7cddfSDavid du Colombier 
10*593dc095SDavid du Colombier   For more information about licensing, please refer to
11*593dc095SDavid du Colombier   http://www.ghostscript.com/licensing/. For information on
12*593dc095SDavid du Colombier   commercial licensing, go to http://www.artifex.com/licensing/ or
13*593dc095SDavid du Colombier   contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14*593dc095SDavid du Colombier   San Rafael, CA  94903, U.S.A., +1(415)492-9861.
157dd7cddfSDavid du Colombier */
167dd7cddfSDavid du Colombier 
17*593dc095SDavid du Colombier /* $Id: gp_unix.c,v 1.13 2004/01/15 09:27:10 giles Exp $ */
187dd7cddfSDavid du Colombier /* Unix-specific routines for Ghostscript */
19*593dc095SDavid du Colombier 
207dd7cddfSDavid du Colombier #include "pipe_.h"
217dd7cddfSDavid du Colombier #include "string_.h"
227dd7cddfSDavid du Colombier #include "time_.h"
237dd7cddfSDavid du Colombier #include "gx.h"
247dd7cddfSDavid du Colombier #include "gsexit.h"
257dd7cddfSDavid du Colombier #include "gp.h"
267dd7cddfSDavid du Colombier 
277dd7cddfSDavid du Colombier /*
287dd7cddfSDavid du Colombier  * This is the only place in Ghostscript that calls 'exit'.  Including
297dd7cddfSDavid du Colombier  * <stdlib.h> is overkill, but that's where it's declared on ANSI systems.
307dd7cddfSDavid du Colombier  * We don't have any way of detecting whether we have a standard library
317dd7cddfSDavid du Colombier  * (some GNU compilers perversely define __STDC__ but don't provide
327dd7cddfSDavid du Colombier  * an ANSI-compliant library), so we check __PROTOTYPES__ and
337dd7cddfSDavid du Colombier  * hope for the best.  We pick up getenv at the same time.
347dd7cddfSDavid du Colombier  */
357dd7cddfSDavid du Colombier #ifdef __PROTOTYPES__
367dd7cddfSDavid du Colombier #  include <stdlib.h>		/* for exit and getenv */
377dd7cddfSDavid du Colombier #else
38*593dc095SDavid du Colombier extern void exit(int);
39*593dc095SDavid du Colombier extern char *getenv(const char *);
407dd7cddfSDavid du Colombier #endif
417dd7cddfSDavid du Colombier 
427dd7cddfSDavid du Colombier /* Do platform-dependent initialization. */
437dd7cddfSDavid du Colombier void
gp_init(void)447dd7cddfSDavid du Colombier gp_init(void)
457dd7cddfSDavid du Colombier {
467dd7cddfSDavid du Colombier }
477dd7cddfSDavid du Colombier 
487dd7cddfSDavid du Colombier /* Do platform-dependent cleanup. */
497dd7cddfSDavid du Colombier void
gp_exit(int exit_status,int code)507dd7cddfSDavid du Colombier gp_exit(int exit_status, int code)
517dd7cddfSDavid du Colombier {
527dd7cddfSDavid du Colombier }
537dd7cddfSDavid du Colombier 
547dd7cddfSDavid du Colombier /* Exit the program. */
557dd7cddfSDavid du Colombier void
gp_do_exit(int exit_status)567dd7cddfSDavid du Colombier gp_do_exit(int exit_status)
577dd7cddfSDavid du Colombier {
58*593dc095SDavid du Colombier     exit(exit_status);
597dd7cddfSDavid du Colombier }
607dd7cddfSDavid du Colombier 
617dd7cddfSDavid du Colombier /* ------ Miscellaneous ------ */
627dd7cddfSDavid du Colombier 
637dd7cddfSDavid du Colombier /* Get the string corresponding to an OS error number. */
647dd7cddfSDavid du Colombier /* Unix systems support this so inconsistently that we don't attempt */
657dd7cddfSDavid du Colombier /* to figure out whether it's available. */
667dd7cddfSDavid du Colombier const char *
gp_strerror(int errnum)677dd7cddfSDavid du Colombier gp_strerror(int errnum)
687dd7cddfSDavid du Colombier {
697dd7cddfSDavid du Colombier     return NULL;
707dd7cddfSDavid du Colombier }
717dd7cddfSDavid du Colombier 
72*593dc095SDavid du Colombier /* read in a MacOS 'resource' from an extended attribute. */
73*593dc095SDavid du Colombier /* we don't try to implemented this since it requires support */
74*593dc095SDavid du Colombier /* for Apple's HFS(+) filesystem */
75*593dc095SDavid du Colombier int
gp_read_macresource(byte * buf,const char * filename,const uint type,const ushort id)76*593dc095SDavid du Colombier gp_read_macresource(byte *buf, const char *filename,
77*593dc095SDavid du Colombier                     const uint type, const ushort id)
78*593dc095SDavid du Colombier {
79*593dc095SDavid du Colombier     return 0;
80*593dc095SDavid du Colombier }
81*593dc095SDavid du Colombier 
827dd7cddfSDavid du Colombier /* ------ Date and time ------ */
837dd7cddfSDavid du Colombier 
847dd7cddfSDavid du Colombier /* Read the current time (in seconds since Jan. 1, 1970) */
857dd7cddfSDavid du Colombier /* and fraction (in nanoseconds). */
867dd7cddfSDavid du Colombier void
gp_get_realtime(long * pdt)877dd7cddfSDavid du Colombier gp_get_realtime(long *pdt)
887dd7cddfSDavid du Colombier {
897dd7cddfSDavid du Colombier     struct timeval tp;
907dd7cddfSDavid du Colombier 
917dd7cddfSDavid du Colombier #if gettimeofday_no_timezone	/* older versions of SVR4 */
927dd7cddfSDavid du Colombier     {
937dd7cddfSDavid du Colombier 	if (gettimeofday(&tp) == -1) {
947dd7cddfSDavid du Colombier 	    lprintf("Ghostscript: gettimeofday failed!\n");
953ff48bf5SDavid du Colombier 	    tp.tv_sec = tp.tv_usec = 0;
967dd7cddfSDavid du Colombier 	}
977dd7cddfSDavid du Colombier     }
987dd7cddfSDavid du Colombier #else /* All other systems */
997dd7cddfSDavid du Colombier     {
1007dd7cddfSDavid du Colombier 	struct timezone tzp;
1017dd7cddfSDavid du Colombier 
1027dd7cddfSDavid du Colombier 	if (gettimeofday(&tp, &tzp) == -1) {
1037dd7cddfSDavid du Colombier 	    lprintf("Ghostscript: gettimeofday failed!\n");
1043ff48bf5SDavid du Colombier 	    tp.tv_sec = tp.tv_usec = 0;
1057dd7cddfSDavid du Colombier 	}
1067dd7cddfSDavid du Colombier     }
1077dd7cddfSDavid du Colombier #endif
1087dd7cddfSDavid du Colombier 
1097dd7cddfSDavid du Colombier     /* tp.tv_sec is #secs since Jan 1, 1970 */
1107dd7cddfSDavid du Colombier     pdt[0] = tp.tv_sec;
1117dd7cddfSDavid du Colombier 
1127dd7cddfSDavid du Colombier     /* Some Unix systems (e.g., Interactive 3.2 r3.0) return garbage */
1137dd7cddfSDavid du Colombier     /* in tp.tv_usec.  Try to filter out the worst of it here. */
1147dd7cddfSDavid du Colombier     pdt[1] = tp.tv_usec >= 0 && tp.tv_usec < 1000000 ? tp.tv_usec * 1000 : 0;
1157dd7cddfSDavid du Colombier 
1167dd7cddfSDavid du Colombier #ifdef DEBUG_CLOCK
1177dd7cddfSDavid du Colombier     printf("tp.tv_sec = %d  tp.tv_usec = %d  pdt[0] = %ld  pdt[1] = %ld\n",
1187dd7cddfSDavid du Colombier 	   tp.tv_sec, tp.tv_usec, pdt[0], pdt[1]);
1197dd7cddfSDavid du Colombier #endif
1207dd7cddfSDavid du Colombier }
1217dd7cddfSDavid du Colombier 
1227dd7cddfSDavid du Colombier /* Read the current user CPU time (in seconds) */
1237dd7cddfSDavid du Colombier /* and fraction (in nanoseconds).  */
1247dd7cddfSDavid du Colombier void
gp_get_usertime(long * pdt)1257dd7cddfSDavid du Colombier gp_get_usertime(long *pdt)
1267dd7cddfSDavid du Colombier {
1277dd7cddfSDavid du Colombier #if use_times_for_usertime
1287dd7cddfSDavid du Colombier     struct tms tms;
1297dd7cddfSDavid du Colombier     long ticks;
1307dd7cddfSDavid du Colombier     const long ticks_per_sec = CLK_TCK;
1317dd7cddfSDavid du Colombier 
1327dd7cddfSDavid du Colombier     times(&tms);
1337dd7cddfSDavid du Colombier     ticks = tms.tms_utime + tms.tms_stime + tms.tms_cutime + tms.tms_cstime;
1347dd7cddfSDavid du Colombier     pdt[0] = ticks / ticks_per_sec;
1357dd7cddfSDavid du Colombier     pdt[1] = (ticks % ticks_per_sec) * (1000000000 / ticks_per_sec);
1367dd7cddfSDavid du Colombier #else
1377dd7cddfSDavid du Colombier     gp_get_realtime(pdt);	/* Use an approximation on other hosts.  */
1387dd7cddfSDavid du Colombier #endif
1397dd7cddfSDavid du Colombier }
1407dd7cddfSDavid du Colombier 
1417dd7cddfSDavid du Colombier /* ------ Screen management ------ */
1427dd7cddfSDavid du Colombier 
1437dd7cddfSDavid du Colombier /* Get the environment variable that specifies the display to use. */
1447dd7cddfSDavid du Colombier const char *
gp_getenv_display(void)1457dd7cddfSDavid du Colombier gp_getenv_display(void)
1467dd7cddfSDavid du Colombier {
1477dd7cddfSDavid du Colombier     return getenv("DISPLAY");
1487dd7cddfSDavid du Colombier }
1497dd7cddfSDavid du Colombier 
1507dd7cddfSDavid du Colombier /* ------ Printer accessing ------ */
1517dd7cddfSDavid du Colombier 
1527dd7cddfSDavid du Colombier /* Open a connection to a printer.  See gp.h for details. */
1537dd7cddfSDavid du Colombier FILE *
gp_open_printer(char fname[gp_file_name_sizeof],int binary_mode)1547dd7cddfSDavid du Colombier gp_open_printer(char fname[gp_file_name_sizeof], int binary_mode)
1557dd7cddfSDavid du Colombier {
1567dd7cddfSDavid du Colombier     const char *fmode = (binary_mode ? "wb" : "w");
1577dd7cddfSDavid du Colombier 
1587dd7cddfSDavid du Colombier     return (strlen(fname) == 0 ? 0 : fopen(fname, fmode));
1597dd7cddfSDavid du Colombier }
1607dd7cddfSDavid du Colombier 
1617dd7cddfSDavid du Colombier /* Close the connection to the printer. */
1627dd7cddfSDavid du Colombier void
gp_close_printer(FILE * pfile,const char * fname)1637dd7cddfSDavid du Colombier gp_close_printer(FILE * pfile, const char *fname)
1647dd7cddfSDavid du Colombier {
1657dd7cddfSDavid du Colombier     if (fname[0] == '|')
1667dd7cddfSDavid du Colombier 	pclose(pfile);
1677dd7cddfSDavid du Colombier     else
1687dd7cddfSDavid du Colombier 	fclose(pfile);
1697dd7cddfSDavid du Colombier }
170*593dc095SDavid du Colombier 
171*593dc095SDavid du Colombier /* ------ Font enumeration ------ */
172*593dc095SDavid du Colombier 
173*593dc095SDavid du Colombier  /* This is used to query the native os for a list of font names and
174*593dc095SDavid du Colombier   * corresponding paths. The general idea is to save the hassle of
175*593dc095SDavid du Colombier   * building a custom fontmap file.
176*593dc095SDavid du Colombier   */
177*593dc095SDavid du Colombier 
gp_enumerate_fonts_init(gs_memory_t * mem)178*593dc095SDavid du Colombier void *gp_enumerate_fonts_init(gs_memory_t *mem)
179*593dc095SDavid du Colombier {
180*593dc095SDavid du Colombier     return NULL;
181*593dc095SDavid du Colombier }
182*593dc095SDavid du Colombier 
gp_enumerate_fonts_next(void * enum_state,char ** fontname,char ** path)183*593dc095SDavid du Colombier int gp_enumerate_fonts_next(void *enum_state, char **fontname, char **path)
184*593dc095SDavid du Colombier {
185*593dc095SDavid du Colombier     return 0;
186*593dc095SDavid du Colombier }
187*593dc095SDavid du Colombier 
gp_enumerate_fonts_free(void * enum_state)188*593dc095SDavid du Colombier void gp_enumerate_fonts_free(void *enum_state)
189*593dc095SDavid du Colombier {
190*593dc095SDavid du Colombier }
191