/* Copyright (C) 1989, 2000 artofcode LLC. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. 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. */ /*$Id: gp_unix.c,v 1.5.2.1.2.1 2003/01/17 00:49:02 giles Exp $ */ /* 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 * 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 /* 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); }