home *** CD-ROM | disk | FTP | other *** search
- /* Copyright (C) 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.
- */
-
- /* gsdsrc.h */
- /* DataSource definitions */
-
- #ifndef gsdsrc_INCLUDED
- # define gsdsrc_INCLUDED
-
- #include "gsstruct.h"
-
- /* ---------------- Types and structures ---------------- */
-
- /*
- * A gs_data_source_t represents the data source for various constructs.
- * Shading. It can be either a string (either a gs_string or a byte-type
- * object) or a positionable, non-procedure-based stream. An ordinary
- * positionable file stream will do, as long as the client doesn't attempt
- * to read past the EOF.
- */
-
- #ifndef stream_DEFINED
- # define stream_DEFINED
- typedef struct stream_s stream;
- #endif
-
- /*
- * Prepare to access a block of data from a source. buf must be a client-
- * supplied buffer of at least length bytes. If ptr == 0, always copy the
- * data into buf. If ptr != 0, either copy the data into buf and set *ptr =
- * buf, or set *ptr to point to the data (which might be invalidated by the
- * next call). Note that this procedure may or may not do bounds checking.
- */
- #define data_source_proc_access(proc)\
- int proc(P5(const gs_data_source_t *psrc, ulong start, uint length,\
- byte *buf, const byte **ptr))
-
- typedef struct gs_data_source_s gs_data_source_t;
- struct gs_data_source_s {
- data_source_proc_access((*access));
- union d_ {
- gs_const_string str; /* also used for byte objects */
- stream *strm;
- } data;
- };
-
- #define data_source_access_only(psrc, start, length, buf, ptr)\
- (*(psrc)->access)(psrc, (ulong)(start), length, buf, ptr)
- #define data_source_access(psrc, start, length, buf, ptr)\
- do {\
- int code_ = data_source_access_only(psrc, start, length, buf, ptr);\
- if ( code_ < 0 ) return code_;\
- } while ( 0 )
- #define data_source_copy_only(psrc, start, length, buf)\
- data_source_access_only(psrc, start, length, buf, (const byte **)0)
- #define data_source_copy(psrc, start, length, buf)\
- data_source_access(psrc, start, length, buf, (const byte **)0)
-
- /*
- * Data sources are always embedded in other structures, but they do have
- * pointers that need to be traced and relocated, so they do have a GC
- * structure type.
- */
- extern_st(st_data_source);
- #define public_st_data_source() /* in gsdsrc.c */\
- gs_public_st_composite(st_data_source, gs_data_source_t, "gs_data_source_t",\
- data_source_enum_ptrs, data_source_reloc_ptrs)
- #define st_data_source_max_ptrs 1
-
- /* ---------------- Procedures ---------------- */
-
- /* Initialize a data source of the various known types. */
- data_source_proc_access(data_source_access_string);
- #define data_source_init_string(psrc, strg)\
- ((psrc)->data.str = strg, (psrc)->access = data_source_access_string)
- #define data_source_init_string2(psrc, bytes, len)\
- ((psrc)->data.str.data = bytes, (psrc)->data.str.size = len,\
- (psrc)->access = data_source_access_string)
- data_source_proc_access(data_source_access_bytes);
- #define data_source_init_bytes(psrc, bytes)\
- ((psrc)->data.str.data = bytes, (psrc)->access = data_source_access_bytes)
- data_source_proc_access(data_source_access_stream);
- #define data_source_init_stream(psrc, s)\
- ((psrc)->data.strm = s, (psrc)->access = data_source_access_stream)
-
- #endif /* gsdsrc_INCLUDED */
-