Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
/* Copyright (C) 1997, 2000 Aladdin Enterprises.  All rights reserved.
2
 
3
  This software is provided AS-IS with no warranty, either express or
4
  implied.
5
 
6
  This software is distributed under license and may not be copied,
7
  modified or distributed except as expressly authorized under the terms
8
  of the license contained in the file LICENSE in this distribution.
9
 
10
  For more information about licensing, please refer to
11
  http://www.ghostscript.com/licensing/. For information on
12
  commercial licensing, go to http://www.artifex.com/licensing/ or
13
  contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14
  San Rafael, CA  94903, U.S.A., +1(415)492-9861.
15
*/
16
 
17
/* $Id: gsdsrc.h,v 1.6 2002/06/16 08:45:42 lpd Exp $ */
18
/* DataSource definitions */
19
 
20
#ifndef gsdsrc_INCLUDED
21
#  define gsdsrc_INCLUDED
22
 
23
#include "gsstruct.h"
24
 
25
/* ---------------- Types and structures ---------------- */
26
 
27
/*
28
 * A gs_data_source_t represents the data source for various constructs.  It
29
 * can be a string (either a gs_string or a byte-type object), a
30
 * positionable, non-procedure-based stream, or an array of floats.  An
31
 * ordinary positionable file stream will do, as long as the client doesn't
32
 * attempt to read past the EOF.
33
 *
34
 * The handling of floats is anomalous, but we don't see a good alternative
35
 * at the moment.
36
 */
37
 
38
#ifndef stream_DEFINED
39
#  define stream_DEFINED
40
typedef struct stream_s stream;
41
#endif
42
 
43
/*
44
 * Prepare to access a block of data from a source.  buf must be a client-
45
 * supplied buffer of at least length bytes.  If ptr == 0, always copy the
46
 * data into buf.  If ptr != 0, either copy the data into buf and set *ptr =
47
 * buf, or set *ptr to point to the data (which might be invalidated by the
48
 * next call).  Note that this procedure may or may not do bounds checking.
49
 */
50
#define data_source_proc_access(proc)\
51
  int proc(const gs_data_source_t *psrc, ulong start, uint length,\
52
	   byte *buf, const byte **ptr)
53
 
54
typedef enum {
55
    data_source_type_string,
56
    data_source_type_bytes,
57
    data_source_type_floats,
58
    data_source_type_stream
59
} gs_data_source_type_t;
60
#ifndef gs_data_source_DEFINED
61
#  define gs_data_source_DEFINED
62
typedef struct gs_data_source_s gs_data_source_t;
63
#endif
64
struct gs_data_source_s {
65
    data_source_proc_access((*access));
66
    gs_data_source_type_t type;
67
    union d_ {
68
	gs_const_string str;	/* also used for byte objects */
69
	stream *strm;
70
    } data;
71
};
72
 
73
#define data_source_access_only(psrc, start, length, buf, ptr)\
74
  (*(psrc)->access)(psrc, (ulong)(start), length, buf, ptr)
75
#define data_source_access(psrc, start, length, buf, ptr)\
76
  BEGIN\
77
    int code_ = data_source_access_only(psrc, start, length, buf, ptr);\
78
    if ( code_ < 0 ) return code_;\
79
  END
80
#define data_source_copy_only(psrc, start, length, buf)\
81
  data_source_access_only(psrc, start, length, buf, (const byte **)0)
82
#define data_source_copy(psrc, start, length, buf)\
83
  data_source_access(psrc, start, length, buf, (const byte **)0)
84
 
85
/*
86
 * Data sources are always embedded in other structures, but they do have
87
 * pointers that need to be traced and relocated, so they do have a GC
88
 * structure type.
89
 */
90
extern_st(st_data_source);
91
#define public_st_data_source()	/* in gsdsrc.c */\
92
  gs_public_st_composite(st_data_source, gs_data_source_t, "gs_data_source_t",\
93
    data_source_enum_ptrs, data_source_reloc_ptrs)
94
#define st_data_source_max_ptrs 1
95
 
96
/* ---------------- Procedures ---------------- */
97
 
98
/* Initialize a data source of the various known types. */
99
data_source_proc_access(data_source_access_string);
100
#define data_source_init_string(psrc, strg)\
101
  ((psrc)->type = data_source_type_string,\
102
   (psrc)->data.str = strg, (psrc)->access = data_source_access_string)
103
#define data_source_init_string2(psrc, bytes, len)\
104
  ((psrc)->type = data_source_type_string,\
105
   (psrc)->data.str.data = bytes, (psrc)->data.str.size = len,\
106
   (psrc)->access = data_source_access_string)
107
data_source_proc_access(data_source_access_bytes);
108
#define data_source_init_bytes(psrc, bytes, len)\
109
  ((psrc)->type = data_source_type_bytes,\
110
   (psrc)->data.str.data = bytes, (psrc)->data.str.size = len,\
111
   (psrc)->access = data_source_access_bytes)
112
#define data_source_init_floats(psrc, floats, count)\
113
  ((psrc)->type = data_source_type_floats,\
114
   (psrc)->data.str.data = (byte *)floats,\
115
   (psrc)->data.str.size = (count) * sizeof(float),\
116
   (psrc)->access = data_source_access_bytes)
117
data_source_proc_access(data_source_access_stream);
118
#define data_source_init_stream(psrc, s)\
119
  ((psrc)->type = data_source_type_stream,\
120
   (psrc)->data.strm = s, (psrc)->access = data_source_access_stream)
121
 
122
#define data_source_is_stream(dsource)\
123
  ((dsource).type == data_source_type_stream)
124
#define data_source_is_array(dsource)\
125
  ((dsource).type == data_source_type_floats)
126
 
127
#endif /* gsdsrc_INCLUDED */