summaryrefslogtreecommitdiff
path: root/gs/src/gxclfile.c
diff options
context:
space:
mode:
authorHenry Stiles <henry.stiles@artifex.com>1998-07-26 07:36:41 +0000
committerHenry Stiles <henry.stiles@artifex.com>1998-07-26 07:36:41 +0000
commiteec0ef527f18c5978c4476c9490f4de4c4249628 (patch)
tree5588d5e1300a245186594893c930949a19bcbbce /gs/src/gxclfile.c
parentd4bdba93ef34f68d27148e1b31088d1d3e786e8c (diff)
downloadghostpdl-eec0ef527f18c5978c4476c9490f4de4c4249628.tar.gz
Initial revision
git-svn-id: http://svn.ghostscript.com/ghostpcl/trunk/ghostpcl@246 06663e23-700e-0410-b217-a244a6096597
Diffstat (limited to 'gs/src/gxclfile.c')
-rw-r--r--gs/src/gxclfile.c145
1 files changed, 145 insertions, 0 deletions
diff --git a/gs/src/gxclfile.c b/gs/src/gxclfile.c
new file mode 100644
index 000000000..47ca91d87
--- /dev/null
+++ b/gs/src/gxclfile.c
@@ -0,0 +1,145 @@
+/* Copyright (C) 1995, 1997 Aladdin Enterprises. All rights reserved.
+
+ This file is part of Aladdin Ghostscript.
+
+ Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND. No author
+ or distributor accepts any responsibility for the consequences of using it,
+ or for whether it serves any particular purpose or works at all, unless he
+ or she says so in writing. Refer to the Aladdin Ghostscript Free Public
+ License (the "License") for full details.
+
+ Every copy of Aladdin Ghostscript must include a copy of the License,
+ normally in a plain ASCII text file named PUBLIC. The License grants you
+ the right to copy, modify and redistribute Aladdin Ghostscript, but only
+ under certain conditions described in the License. Among other things, the
+ License requires that the copyright notice and this notice be preserved on
+ all copies.
+*/
+
+/* gxclfile.c */
+/* File-based command list implementation */
+#include "stdio_.h"
+#include "string_.h"
+#include "gserror.h"
+#include "gserrors.h"
+#include "gsmemory.h"
+#include "gp.h"
+#include "gxclio.h"
+
+/* This is an implementation of the command list I/O interface */
+/* that uses the file system for storage. */
+
+/* ------ Open/close/unlink ------ */
+
+int
+clist_fopen(char *fname, const char *fmode, clist_file_ptr *pcf,
+ gs_memory_t *mem, gs_memory_t *data_mem, bool ok_to_compress)
+{ if ( *fname == 0 )
+ { if ( fmode[0] == 'r' )
+ return_error(gs_error_invalidfileaccess);
+ *pcf =
+ (clist_file_ptr)gp_open_scratch_file(gp_scratch_file_name_prefix,
+ fname, fmode);
+ }
+ else
+ *pcf = gp_fopen(fname, fmode);
+ if ( *pcf == NULL )
+ { eprintf1("Could not open the scratch file %s.\n", fname);
+ return_error(gs_error_invalidfileaccess);
+ }
+ return 0;
+}
+
+int
+clist_fclose(clist_file_ptr cf, const char *fname, bool delete)
+{ return (fclose((FILE *)cf) != 0 ? gs_note_error(gs_error_ioerror) :
+ delete ? clist_unlink(fname) :
+ 0);
+}
+
+int
+clist_unlink(const char *fname)
+{ return (unlink(fname) != 0 ? gs_note_error(gs_error_ioerror) : 0);
+}
+
+/* ------ Writing ------ */
+
+long
+clist_space_available(long requested)
+{ return requested;
+}
+
+int
+clist_fwrite_chars(const void *data, uint len, clist_file_ptr cf)
+{ return fwrite(data, 1, len, (FILE *)cf);
+}
+
+/* ------ Reading ------ */
+
+int
+clist_fread_chars(void *data, uint len, clist_file_ptr cf)
+{ FILE *f = (FILE *)cf;
+ byte *str = data;
+
+ /* The typical implementation of fread */
+ /* is extremely inefficient for small counts, */
+ /* so we just use straight-line code instead. */
+ switch ( len )
+ {
+ default: return fread(str, 1, len, f);
+ case 8: *str++ = (byte)getc(f);
+ case 7: *str++ = (byte)getc(f);
+ case 6: *str++ = (byte)getc(f);
+ case 5: *str++ = (byte)getc(f);
+ case 4: *str++ = (byte)getc(f);
+ case 3: *str++ = (byte)getc(f);
+ case 2: *str++ = (byte)getc(f);
+ case 1: *str = (byte)getc(f);
+ }
+ return len;
+}
+
+/* ------ Position/status ------ */
+
+int
+clist_set_block_size(clist_file_ptr cf, int sizeofBlock)
+{ return 0; /* always successful */
+}
+
+int
+clist_ferror_code(clist_file_ptr cf)
+{ return (ferror((FILE *)cf) ? gs_error_ioerror : 0);
+}
+
+long
+clist_ftell(clist_file_ptr cf)
+{ return ftell((FILE *)cf);
+}
+
+void
+clist_rewind(clist_file_ptr cf, bool discard_data, const char *fname)
+{ FILE *f = (FILE *)cf;
+
+ if ( discard_data ) {
+ /*
+ * The ANSI C stdio specification provides no operation for
+ * truncating a file at a given position, or even just for
+ * deleting its contents; we have to use a bizarre workaround to
+ * get the same effect.
+ */
+ char fmode[4];
+
+ /* Opening with "w" mode deletes the contents when closing. */
+ freopen(fname, gp_fmode_wb, f);
+ strcpy(fmode, "w+");
+ strcat(fmode, gp_fmode_binary_suffix);
+ freopen(fname, fmode, f);
+ } else {
+ rewind(f);
+ }
+}
+
+int
+clist_fseek(clist_file_ptr cf, long offset, int mode, const char *ignore_fname)
+{ return fseek((FILE *)cf, offset, mode);
+}