xref: /plan9/sys/src/cmd/gs/src/gp_os9.c (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
1*593dc095SDavid du Colombier /* Copyright (C) 1989, 2000-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_os9.c,v 1.12 2004/01/15 09:27:10 giles Exp $ */
187dd7cddfSDavid du Colombier /* OSK-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 "gp.h"
257dd7cddfSDavid du Colombier #include <signal.h>
267dd7cddfSDavid du Colombier #include <stdlib.h>		/* for exit */
277dd7cddfSDavid du Colombier 
287dd7cddfSDavid du Colombier int interrupted;
297dd7cddfSDavid du Colombier 
307dd7cddfSDavid du Colombier /* Forward declarations */
31*593dc095SDavid du Colombier private void signalhandler(int);
32*593dc095SDavid du Colombier private FILE *rbfopen(char *, char *);
337dd7cddfSDavid du Colombier 
347dd7cddfSDavid du Colombier /* Do platform-dependent initialization */
357dd7cddfSDavid du Colombier void
gp_init(void)367dd7cddfSDavid du Colombier gp_init(void)
377dd7cddfSDavid du Colombier {
387dd7cddfSDavid du Colombier     intercept(signalhandler);
397dd7cddfSDavid du Colombier }
407dd7cddfSDavid du Colombier 
417dd7cddfSDavid du Colombier /* Do platform-dependent cleanup. */
427dd7cddfSDavid du Colombier void
gp_exit(int exit_status,int code)437dd7cddfSDavid du Colombier gp_exit(int exit_status, int code)
447dd7cddfSDavid du Colombier {
457dd7cddfSDavid du Colombier }
467dd7cddfSDavid du Colombier 
477dd7cddfSDavid du Colombier /* Exit the program. */
487dd7cddfSDavid du Colombier void
gp_do_exit(int exit_status)497dd7cddfSDavid du Colombier gp_do_exit(int exit_status)
507dd7cddfSDavid du Colombier {
51*593dc095SDavid du Colombier     exit(exit_status);
527dd7cddfSDavid du Colombier }
537dd7cddfSDavid du Colombier 
547dd7cddfSDavid du Colombier private void
signalhandler(int sig)557dd7cddfSDavid du Colombier signalhandler(int sig)
567dd7cddfSDavid du Colombier {
577dd7cddfSDavid du Colombier     clearerr(stdin);
587dd7cddfSDavid du Colombier     switch (sig) {
597dd7cddfSDavid du Colombier 	case SIGINT:
607dd7cddfSDavid du Colombier 	case SIGQUIT:
617dd7cddfSDavid du Colombier 	    interrupted = 1;
627dd7cddfSDavid du Colombier 	    break;
637dd7cddfSDavid du Colombier 	case SIGFPE:
647dd7cddfSDavid du Colombier 	    interrupted = 2;
657dd7cddfSDavid du Colombier 	    break;
667dd7cddfSDavid du Colombier 	default:
677dd7cddfSDavid du Colombier 	    break;
687dd7cddfSDavid du Colombier     }
697dd7cddfSDavid du Colombier }
707dd7cddfSDavid du Colombier 
717dd7cddfSDavid du Colombier /* ------ Date and time ------ */
727dd7cddfSDavid du Colombier 
737dd7cddfSDavid du Colombier /* Read the current time (in seconds since Jan. 1, 1980) */
747dd7cddfSDavid du Colombier /* and fraction (in nanoseconds). */
757dd7cddfSDavid du Colombier #define PS_YEAR_0 80
767dd7cddfSDavid du Colombier #define PS_MONTH_0 1
777dd7cddfSDavid du Colombier #define PS_DAY_0 1
787dd7cddfSDavid du Colombier void
gp_get_realtime(long * pdt)797dd7cddfSDavid du Colombier gp_get_realtime(long *pdt)
807dd7cddfSDavid du Colombier {
817dd7cddfSDavid du Colombier     long date, time, pstime, psdate, tick;
827dd7cddfSDavid du Colombier     short day;
837dd7cddfSDavid du Colombier 
847dd7cddfSDavid du Colombier     _sysdate(0, &time, &date, &day, &tick);
857dd7cddfSDavid du Colombier     _julian(&time, &date);
867dd7cddfSDavid du Colombier 
877dd7cddfSDavid du Colombier     pstime = 0;
887dd7cddfSDavid du Colombier     psdate = (PS_YEAR_0 << 16) + (PS_MONTH_0 << 8) + PS_DAY_0;
897dd7cddfSDavid du Colombier     _julian(&pstime, &psdate);
907dd7cddfSDavid du Colombier 
917dd7cddfSDavid du Colombier     pdt[0] = (date - psdate) * 86400 + time;
927dd7cddfSDavid du Colombier     pdt[1] = 0;
937dd7cddfSDavid du Colombier 
947dd7cddfSDavid du Colombier #ifdef DEBUG_CLOCK
957dd7cddfSDavid du Colombier     printf("pdt[0] = %ld  pdt[1] = %ld\n", pdt[0], pdt[1]);
967dd7cddfSDavid du Colombier #endif
977dd7cddfSDavid du Colombier }
987dd7cddfSDavid du Colombier 
997dd7cddfSDavid du Colombier /* Read the current user CPU time (in seconds) */
1007dd7cddfSDavid du Colombier /* and fraction (in nanoseconds).  */
1017dd7cddfSDavid du Colombier void
gp_get_usertime(long * pdt)1027dd7cddfSDavid du Colombier gp_get_usertime(long *pdt)
1037dd7cddfSDavid du Colombier {
1047dd7cddfSDavid du Colombier     return gp_get_realtime(pdt);	/* not yet implemented */
1057dd7cddfSDavid du Colombier }
1067dd7cddfSDavid du Colombier 
107*593dc095SDavid du Colombier 
108*593dc095SDavid du Colombier /* ------ Persistent data cache ------*/
109*593dc095SDavid du Colombier 
110*593dc095SDavid du Colombier /* insert a buffer under a (type, key) pair */
gp_cache_insert(int type,byte * key,int keylen,void * buffer,int buflen)111*593dc095SDavid du Colombier int gp_cache_insert(int type, byte *key, int keylen, void *buffer, int buflen)
112*593dc095SDavid du Colombier {
113*593dc095SDavid du Colombier     /* not yet implemented */
114*593dc095SDavid du Colombier     return 0;
115*593dc095SDavid du Colombier }
116*593dc095SDavid du Colombier 
117*593dc095SDavid du Colombier /* look up a (type, key) in the cache */
gp_cache_query(int type,byte * key,int keylen,void ** buffer,gp_cache_alloc alloc,void * userdata)118*593dc095SDavid du Colombier int gp_cache_query(int type, byte* key, int keylen, void **buffer,
119*593dc095SDavid du Colombier     gp_cache_alloc alloc, void *userdata)
120*593dc095SDavid du Colombier {
121*593dc095SDavid du Colombier     /* not yet implemented */
122*593dc095SDavid du Colombier     return -1;
123*593dc095SDavid du Colombier }
124*593dc095SDavid du Colombier 
1257dd7cddfSDavid du Colombier /* ------ Printer accessing ------ */
1267dd7cddfSDavid du Colombier 
1277dd7cddfSDavid du Colombier /* Open a connection to a printer.  A null file name means use the */
1287dd7cddfSDavid du Colombier /* standard printer connected to the machine, if any. */
1297dd7cddfSDavid du Colombier /* "|command" opens an output pipe. */
1307dd7cddfSDavid du Colombier /* Return NULL if the connection could not be opened. */
1317dd7cddfSDavid du Colombier FILE *
gp_open_printer(char fname[gp_file_name_sizeof],int binary_mode)1327dd7cddfSDavid du Colombier gp_open_printer(char fname[gp_file_name_sizeof], int binary_mode)
1337dd7cddfSDavid du Colombier {
1347dd7cddfSDavid du Colombier     return
1357dd7cddfSDavid du Colombier 	(strlen(fname) == 0 ? 0 :
1367dd7cddfSDavid du Colombier 	 fname[0] == '|' ? popen(fname + 1, "w") :
1377dd7cddfSDavid du Colombier 	 rbfopen(fname, "w"));
1387dd7cddfSDavid du Colombier }
1397dd7cddfSDavid du Colombier 
1407dd7cddfSDavid du Colombier FILE *
rbfopen(char * fname,char * perm)1417dd7cddfSDavid du Colombier rbfopen(char *fname, char *perm)
1427dd7cddfSDavid du Colombier {
1437dd7cddfSDavid du Colombier     FILE *file = fopen(fname, perm);
1447dd7cddfSDavid du Colombier 
1457dd7cddfSDavid du Colombier     file->_flag |= _RBF;
1467dd7cddfSDavid du Colombier     return file;
1477dd7cddfSDavid du Colombier }
1487dd7cddfSDavid du Colombier 
1497dd7cddfSDavid du Colombier /* Close the connection to the printer. */
1507dd7cddfSDavid du Colombier void
gp_close_printer(FILE * pfile,const char * fname)1517dd7cddfSDavid du Colombier gp_close_printer(FILE * pfile, const char *fname)
1527dd7cddfSDavid du Colombier {
1537dd7cddfSDavid du Colombier     if (fname[0] == '|')
1547dd7cddfSDavid du Colombier 	pclose(pfile);
1557dd7cddfSDavid du Colombier     else
1567dd7cddfSDavid du Colombier 	fclose(pfile);
1577dd7cddfSDavid du Colombier }
1587dd7cddfSDavid du Colombier 
1597dd7cddfSDavid du Colombier /* ------ File accessing -------- */
1607dd7cddfSDavid du Colombier 
1617dd7cddfSDavid du Colombier /* Set a file into binary or text mode. */
1627dd7cddfSDavid du Colombier int
gp_setmode_binary(FILE * pfile,bool binary)1637dd7cddfSDavid du Colombier gp_setmode_binary(FILE * pfile, bool binary)
1647dd7cddfSDavid du Colombier {
1657dd7cddfSDavid du Colombier     if (binary)
1667dd7cddfSDavid du Colombier 	file->_flag |= _RBF;
1677dd7cddfSDavid du Colombier     else
1687dd7cddfSDavid du Colombier 	file->_flag &= ~_RBF;
1697dd7cddfSDavid du Colombier     return 0;
1707dd7cddfSDavid du Colombier }
171*593dc095SDavid du Colombier 
172*593dc095SDavid du Colombier /* ------ Font enumeration ------ */
173*593dc095SDavid du Colombier 
174*593dc095SDavid du Colombier  /* This is used to query the native os for a list of font names and
175*593dc095SDavid du Colombier   * corresponding paths. The general idea is to save the hassle of
176*593dc095SDavid du Colombier   * building a custom fontmap file.
177*593dc095SDavid du Colombier   */
178*593dc095SDavid du Colombier 
gp_enumerate_fonts_init(gs_memory_t * mem)179*593dc095SDavid du Colombier void *gp_enumerate_fonts_init(gs_memory_t *mem)
180*593dc095SDavid du Colombier {
181*593dc095SDavid du Colombier     return NULL;
182*593dc095SDavid du Colombier }
183*593dc095SDavid du Colombier 
gp_enumerate_fonts_next(void * enum_state,char ** fontname,char ** path)184*593dc095SDavid du Colombier int gp_enumerate_fonts_next(void *enum_state, char **fontname, char **path)
185*593dc095SDavid du Colombier {
186*593dc095SDavid du Colombier     return 0;
187*593dc095SDavid du Colombier }
188*593dc095SDavid du Colombier 
gp_enumerate_fonts_free(void * enum_state)189*593dc095SDavid du Colombier void gp_enumerate_fonts_free(void *enum_state)
190*593dc095SDavid du Colombier {
191*593dc095SDavid du Colombier }
192