diff options
author | Henry Stiles <henry.stiles@artifex.com> | 1998-07-26 07:36:41 +0000 |
---|---|---|
committer | Henry Stiles <henry.stiles@artifex.com> | 1998-07-26 07:36:41 +0000 |
commit | eec0ef527f18c5978c4476c9490f4de4c4249628 (patch) | |
tree | 5588d5e1300a245186594893c930949a19bcbbce /gs/src/gxclfile.c | |
parent | d4bdba93ef34f68d27148e1b31088d1d3e786e8c (diff) | |
download | ghostpdl-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.c | 145 |
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); +} |