xref: /plan9/sys/src/cmd/gs/src/gp_dosfs.c (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
17dd7cddfSDavid du Colombier /* Copyright (C) 1992, 1993, 1996, 1998 Aladdin Enterprises.  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_dosfs.c,v 1.17 2004/04/08 16:18:25 giles Exp $ */
187dd7cddfSDavid du Colombier /* Common routines for MS-DOS (any compiler) and DesqView/X, */
197dd7cddfSDavid du Colombier /* which has a MS-DOS-like file system. */
207dd7cddfSDavid du Colombier #include "dos_.h"
217dd7cddfSDavid du Colombier #include "gx.h"
227dd7cddfSDavid du Colombier #include "gp.h"
23*593dc095SDavid du Colombier #include "gpmisc.h"
247dd7cddfSDavid du Colombier 
257dd7cddfSDavid du Colombier /* ------ Printer accessing ------ */
267dd7cddfSDavid du Colombier 
277dd7cddfSDavid du Colombier /* Put a printer file (which might be stdout) into binary or text mode. */
287dd7cddfSDavid du Colombier /* This is not a standard gp procedure, */
297dd7cddfSDavid du Colombier /* but all MS-DOS configurations need it. */
307dd7cddfSDavid du Colombier void
gp_set_file_binary(int prnfno,bool binary)317dd7cddfSDavid du Colombier gp_set_file_binary(int prnfno, bool binary)
327dd7cddfSDavid du Colombier {
337dd7cddfSDavid du Colombier     union REGS regs;
347dd7cddfSDavid du Colombier 
357dd7cddfSDavid du Colombier     regs.h.ah = 0x44;		/* ioctl */
367dd7cddfSDavid du Colombier     regs.h.al = 0;		/* get device info */
377dd7cddfSDavid du Colombier     regs.rshort.bx = prnfno;
387dd7cddfSDavid du Colombier     intdos(&regs, &regs);
397dd7cddfSDavid du Colombier     if (regs.rshort.cflag != 0 || !(regs.h.dl & 0x80))
407dd7cddfSDavid du Colombier 	return;			/* error, or not a device */
417dd7cddfSDavid du Colombier     if (binary)
427dd7cddfSDavid du Colombier 	regs.h.dl |= 0x20;	/* binary (no ^Z intervention) */
437dd7cddfSDavid du Colombier     else
447dd7cddfSDavid du Colombier 	regs.h.dl &= ~0x20;	/* text */
457dd7cddfSDavid du Colombier     regs.h.dh = 0;
467dd7cddfSDavid du Colombier     regs.h.ah = 0x44;		/* ioctl */
477dd7cddfSDavid du Colombier     regs.h.al = 1;		/* set device info */
487dd7cddfSDavid du Colombier     intdos(&regs, &regs);
497dd7cddfSDavid du Colombier }
507dd7cddfSDavid du Colombier 
517dd7cddfSDavid du Colombier /* ------ File accessing ------ */
527dd7cddfSDavid du Colombier 
537dd7cddfSDavid du Colombier /* Set a file into binary or text mode. */
547dd7cddfSDavid du Colombier int
gp_setmode_binary(FILE * pfile,bool binary)557dd7cddfSDavid du Colombier gp_setmode_binary(FILE * pfile, bool binary)
567dd7cddfSDavid du Colombier {
577dd7cddfSDavid du Colombier     gp_set_file_binary(fileno(pfile), binary);
587dd7cddfSDavid du Colombier     return 0;			/* Fake out dos return status */
597dd7cddfSDavid du Colombier }
607dd7cddfSDavid du Colombier 
617dd7cddfSDavid du Colombier /* ------ File names ------ */
627dd7cddfSDavid du Colombier 
637dd7cddfSDavid du Colombier /* Define the character used for separating file names in a list. */
647dd7cddfSDavid du Colombier const char gp_file_name_list_separator = ';';
657dd7cddfSDavid du Colombier 
667dd7cddfSDavid du Colombier /* Define the string to be concatenated with the file mode */
677dd7cddfSDavid du Colombier /* for opening files without end-of-line conversion. */
687dd7cddfSDavid du Colombier const char gp_fmode_binary_suffix[] = "b";
697dd7cddfSDavid du Colombier 
707dd7cddfSDavid du Colombier /* Define the file modes for binary reading or writing. */
717dd7cddfSDavid du Colombier const char gp_fmode_rb[] = "rb";
727dd7cddfSDavid du Colombier const char gp_fmode_wb[] = "wb";
737dd7cddfSDavid du Colombier 
74*593dc095SDavid du Colombier /* -------------- Helpers for gp_file_name_combine_generic ------------- */
757dd7cddfSDavid du Colombier 
gp_file_name_root(const char * fname,uint len)76*593dc095SDavid du Colombier uint gp_file_name_root(const char *fname, uint len)
77*593dc095SDavid du Colombier {   int i = 0;
783ff48bf5SDavid du Colombier 
79*593dc095SDavid du Colombier     if (len == 0)
80*593dc095SDavid du Colombier 	return 0;
81*593dc095SDavid du Colombier     if (len > 1 && fname[0] == '\\' && fname[1] == '\\') {
82*593dc095SDavid du Colombier 	/* A network path: "\\server\share\" */
83*593dc095SDavid du Colombier 	int k = 0;
84*593dc095SDavid du Colombier 
85*593dc095SDavid du Colombier 	for (i = 2; i < len; i++)
86*593dc095SDavid du Colombier 	    if (fname[i] == '\\' || fname[i] == '/')
87*593dc095SDavid du Colombier 		if (k++) {
883ff48bf5SDavid du Colombier 		    i++;
89*593dc095SDavid du Colombier 		    break;
903ff48bf5SDavid du Colombier 		}
91*593dc095SDavid du Colombier     } else if (fname[0] == '/' || fname[0] == '\\') {
92*593dc095SDavid du Colombier 	/* Absolute with no drive. */
93*593dc095SDavid du Colombier 	i = 1;
94*593dc095SDavid du Colombier     } else if (len > 1 && fname[1] == ':') {
95*593dc095SDavid du Colombier 	/* Absolute with a drive. */
96*593dc095SDavid du Colombier 	i = (len > 2 && (fname[2] == '/' || fname[2] == '\\') ? 3 : 2);
97*593dc095SDavid du Colombier     }
98*593dc095SDavid du Colombier     return i;
993ff48bf5SDavid du Colombier }
1003ff48bf5SDavid du Colombier 
gs_file_name_check_separator(const char * fname,int len,const char * item)101*593dc095SDavid du Colombier uint gs_file_name_check_separator(const char *fname, int len, const char *item)
102*593dc095SDavid du Colombier {   if (len > 0) {
103*593dc095SDavid du Colombier 	if (fname[0] == '/' || fname[0] == '\\')
104*593dc095SDavid du Colombier 	    return 1;
105*593dc095SDavid du Colombier     } else if (len < 0) {
106*593dc095SDavid du Colombier 	if (fname[-1] == '/' || fname[-1] == '\\')
107*593dc095SDavid du Colombier 	    return 1;
108*593dc095SDavid du Colombier     }
109*593dc095SDavid du Colombier     return 0;
110*593dc095SDavid du Colombier }
1113ff48bf5SDavid du Colombier 
gp_file_name_is_parent(const char * fname,uint len)112*593dc095SDavid du Colombier bool gp_file_name_is_parent(const char *fname, uint len)
113*593dc095SDavid du Colombier {   return len == 2 && fname[0] == '.' && fname[1] == '.';
114*593dc095SDavid du Colombier }
115*593dc095SDavid du Colombier 
gp_file_name_is_current(const char * fname,uint len)116*593dc095SDavid du Colombier bool gp_file_name_is_current(const char *fname, uint len)
117*593dc095SDavid du Colombier {   return len == 1 && fname[0] == '.';
118*593dc095SDavid du Colombier }
119*593dc095SDavid du Colombier 
gp_file_name_separator(void)120*593dc095SDavid du Colombier const char *gp_file_name_separator(void)
121*593dc095SDavid du Colombier {   return "/";
122*593dc095SDavid du Colombier }
123*593dc095SDavid du Colombier 
gp_file_name_directory_separator(void)124*593dc095SDavid du Colombier const char *gp_file_name_directory_separator(void)
125*593dc095SDavid du Colombier {   return "/";
126*593dc095SDavid du Colombier }
127*593dc095SDavid du Colombier 
gp_file_name_parent(void)128*593dc095SDavid du Colombier const char *gp_file_name_parent(void)
129*593dc095SDavid du Colombier {   return "..";
130*593dc095SDavid du Colombier }
131*593dc095SDavid du Colombier 
gp_file_name_current(void)132*593dc095SDavid du Colombier const char *gp_file_name_current(void)
133*593dc095SDavid du Colombier {   return ".";
134*593dc095SDavid du Colombier }
135*593dc095SDavid du Colombier 
gp_file_name_is_partent_allowed(void)136*593dc095SDavid du Colombier bool gp_file_name_is_partent_allowed(void)
137*593dc095SDavid du Colombier {   return true;
138*593dc095SDavid du Colombier }
139*593dc095SDavid du Colombier 
gp_file_name_is_empty_item_meanful(void)140*593dc095SDavid du Colombier bool gp_file_name_is_empty_item_meanful(void)
141*593dc095SDavid du Colombier {   return false;
142*593dc095SDavid du Colombier }
143*593dc095SDavid du Colombier 
144*593dc095SDavid du Colombier gp_file_name_combine_result
gp_file_name_combine(const char * prefix,uint plen,const char * fname,uint flen,bool no_sibling,char * buffer,uint * blen)145*593dc095SDavid du Colombier gp_file_name_combine(const char *prefix, uint plen, const char *fname, uint flen,
146*593dc095SDavid du Colombier 		    bool no_sibling, char *buffer, uint *blen)
1477dd7cddfSDavid du Colombier {
148*593dc095SDavid du Colombier     return gp_file_name_combine_generic(prefix, plen,
149*593dc095SDavid du Colombier 	    fname, flen, no_sibling, buffer, blen);
1507dd7cddfSDavid du Colombier }
151