2 |
- |
1 |
/* Copyright (C) 1995, 1996, 1997, 1998 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: gxclmem.h,v 1.5 2002/06/16 08:45:43 lpd Exp $ */
|
|
|
18 |
/* Definitions and declarations for clist implementation in memory. */
|
|
|
19 |
|
|
|
20 |
#ifndef gxclmem_INCLUDED
|
|
|
21 |
# define gxclmem_INCLUDED
|
|
|
22 |
|
|
|
23 |
#include "gxclio.h" /* defines interface */
|
|
|
24 |
#include "strimpl.h" /* stream structures */
|
|
|
25 |
|
|
|
26 |
/*
|
|
|
27 |
* The best values of MEMFILE_DATA_SIZE are slightly less than a power of 2,
|
|
|
28 |
* to allow typical malloc implementations to allocate in units of a power
|
|
|
29 |
* of 2 rather than having to go slightly over.
|
|
|
30 |
*/
|
|
|
31 |
#define MEMFILE_DATA_SIZE (16384 - 160)
|
|
|
32 |
|
|
|
33 |
/* ============================================================ */
|
|
|
34 |
/* */
|
|
|
35 |
/* Memfile structure definitions. */
|
|
|
36 |
/* */
|
|
|
37 |
/* The PHYS structures are the elements actually allocated in */
|
|
|
38 |
/* RAM, containing the compressed data (or optionally raw data) */
|
|
|
39 |
/* */
|
|
|
40 |
/* There can be several LOG (logical) elements per physical */
|
|
|
41 |
/* element, depending on the compression. The MEMFILE pdata */
|
|
|
42 |
/* item always points into a raw block of data. */
|
|
|
43 |
/* */
|
|
|
44 |
/* ============================================================ */
|
|
|
45 |
|
|
|
46 |
typedef struct RAW_BUFFER {
|
|
|
47 |
struct RAW_BUFFER *fwd, *back;
|
|
|
48 |
struct LOG_MEMFILE_BLK *log_blk;
|
|
|
49 |
char data[MEMFILE_DATA_SIZE];
|
|
|
50 |
} RAW_BUFFER;
|
|
|
51 |
|
|
|
52 |
typedef struct PHYS_MEMFILE_BLK {
|
|
|
53 |
struct PHYS_MEMFILE_BLK *link;
|
|
|
54 |
char *data_limit; /* end of data when compressed */
|
|
|
55 |
/* NULL if not compressed */
|
|
|
56 |
char data_spare[4]; /* used during de-compress */
|
|
|
57 |
char data[MEMFILE_DATA_SIZE];
|
|
|
58 |
} PHYS_MEMFILE_BLK;
|
|
|
59 |
|
|
|
60 |
typedef struct LOG_MEMFILE_BLK {
|
|
|
61 |
struct LOG_MEMFILE_BLK *link;
|
|
|
62 |
PHYS_MEMFILE_BLK *phys_blk;
|
|
|
63 |
char *phys_pdata;
|
|
|
64 |
RAW_BUFFER *raw_block; /* or NULL */
|
|
|
65 |
} LOG_MEMFILE_BLK;
|
|
|
66 |
|
|
|
67 |
typedef struct MEMFILE {
|
|
|
68 |
gs_memory_t *memory; /* storage allocator */
|
|
|
69 |
gs_memory_t *data_memory; /* storage allocator for data */
|
|
|
70 |
bool ok_to_compress; /* if true, OK to compress this file */
|
|
|
71 |
/*
|
|
|
72 |
* Reserve memory blocks: these are used to guarantee that a
|
|
|
73 |
* given-sized write (or sequence of writes) will always succeed.
|
|
|
74 |
* More specifically, the guarantee is that N bytes can successfully
|
|
|
75 |
* be written after a low-memory warning is first returned by
|
|
|
76 |
* fwrite. The reserve of N bytes for a given file is (re)allocated
|
|
|
77 |
* by a successful call to memfile_set_memory_warning(N). Fwrite
|
|
|
78 |
* allocates memory only from the reserve when its normal allocation
|
|
|
79 |
* attempts fail; in such cases, it allocates blocks from the
|
|
|
80 |
* reserve pool as needed and completes normally, but returns a
|
|
|
81 |
* low-memory warning status. Once a low-memory warning has been
|
|
|
82 |
* returned, fwrite will continue to attempt to allocate memory from
|
|
|
83 |
* the usual allocator on subsequent fwrites, but does *not* try to
|
|
|
84 |
* "top up" the reserve if becomes available -- only an explicit
|
|
|
85 |
* memfile_set_memory_warning does so.
|
|
|
86 |
*/
|
|
|
87 |
PHYS_MEMFILE_BLK *reservePhysBlockChain; /* chain of reserve phys blks */
|
|
|
88 |
int reservePhysBlockCount; /* count of entries on reservePhysBlockChain */
|
|
|
89 |
LOG_MEMFILE_BLK *reserveLogBlockChain; /* chain of reserve log blks */
|
|
|
90 |
int reserveLogBlockCount; /* count of entries on reserveLogBlockChain */
|
|
|
91 |
/* logical file properties */
|
|
|
92 |
LOG_MEMFILE_BLK *log_head;
|
|
|
93 |
LOG_MEMFILE_BLK *log_curr_blk;
|
|
|
94 |
long log_length; /* updated during write */
|
|
|
95 |
long log_curr_pos; /* updated during seek, close, read */
|
|
|
96 |
char *pdata; /* raw data */
|
|
|
97 |
char *pdata_end;
|
|
|
98 |
/* physical file properties */
|
|
|
99 |
long total_space; /* so we know when to start compress */
|
|
|
100 |
PHYS_MEMFILE_BLK *phys_curr; /* NULL if not compressing */
|
|
|
101 |
RAW_BUFFER *raw_head, *raw_tail;
|
|
|
102 |
int error_code; /* used by CLIST_ferror */
|
|
|
103 |
stream_cursor_read rd; /* use .ptr, .limit */
|
|
|
104 |
stream_cursor_write wt; /* use .ptr, .limit */
|
|
|
105 |
bool compressor_initialized;
|
|
|
106 |
stream_state *compress_state;
|
|
|
107 |
stream_state *decompress_state;
|
|
|
108 |
} MEMFILE;
|
|
|
109 |
|
|
|
110 |
/*
|
|
|
111 |
* Only the MEMFILE and stream_state structures are GC-compatible, so we
|
|
|
112 |
* allocate all the other structures on the C heap.
|
|
|
113 |
*/
|
|
|
114 |
|
|
|
115 |
#define private_st_MEMFILE() /* in gxclmem.c */\
|
|
|
116 |
gs_private_st_ptrs2(st_MEMFILE, MEMFILE, "MEMFILE",\
|
|
|
117 |
MEMFILE_enum_ptrs, MEMFILE_reloc_ptrs, compress_state, decompress_state)
|
|
|
118 |
|
|
|
119 |
/* Make the memfile_... operations aliases for the clist_... operations. */
|
|
|
120 |
|
|
|
121 |
#define memfile_fopen(fname, fmode, pcf, mem, data_mem, compress)\
|
|
|
122 |
clist_fopen(fname, fmode, pcf, mem, data_mem, compress)
|
|
|
123 |
#define memfile_fclose(cf, fname, delete)\
|
|
|
124 |
clist_fclose(cf, fname, delete)
|
|
|
125 |
#define memfile_unlink(fname)\
|
|
|
126 |
clist_unlink(fname)
|
|
|
127 |
|
|
|
128 |
#define memfile_space_available(req)\
|
|
|
129 |
clist_space_available(req)
|
|
|
130 |
#define memfile_fwrite_chars(data, len, cf)\
|
|
|
131 |
clist_fwrite_chars(data, len, cf)
|
|
|
132 |
|
|
|
133 |
#define memfile_fread_chars(data, len, cf)\
|
|
|
134 |
clist_fread_chars(data, len, cf)
|
|
|
135 |
|
|
|
136 |
#define memfile_set_memory_warning(cf, nbytes) clist_set_memory_warning(cf, nbytes)
|
|
|
137 |
#define memfile_ferror_code(cf) clist_ferror_code(cf)
|
|
|
138 |
#define memfile_ftell(cf) clist_ftell(cf)
|
|
|
139 |
#define memfile_rewind(cf, discard, fname) clist_rewind(cf, discard, fname)
|
|
|
140 |
#define memfile_fseek(cf, offset, mode, fname) clist_fseek(cf, offset, mode, fname)
|
|
|
141 |
|
|
|
142 |
/* Declare the procedures for returning the prototype filter states */
|
|
|
143 |
/* for compressing and decompressing the band list. */
|
|
|
144 |
const stream_state *clist_compressor_state(void *);
|
|
|
145 |
const stream_state *clist_decompressor_state(void *);
|
|
|
146 |
|
|
|
147 |
#endif /* gxclmem_INCLUDED */
|