home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 1996 February
/
PCWK0296.iso
/
sharewar
/
dos
/
program
/
gs300sr1
/
gs300sr1.exe
/
IDICT.H
< prev
next >
Wrap
C/C++ Source or Header
|
1994-07-27
|
5KB
|
133 lines
/* Copyright (C) 1989, 1992, 1993, 1994 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.
*/
/* idict.h */
/* Interfaces for Ghostscript dictionary package */
/*
* Contrary to our usual practice, we expose the (first-level)
* representation of a dictionary in the interface file,
* because it is so important that access checking go fast.
* The access attributes for the dictionary are stored in
* the values ref.
*/
struct dict_s {
ref values; /* t_array, values */
ref keys; /* t_shortarray or t_array, keys */
ref count; /* t_integer, count of occupied entries */
/* (length) */
ref maxlength; /* t_integer, maxlength as seen by client. */
};
/* Define the maximum size of a dictionary. */
extern const uint dict_max_size;
/*
* Define whether dictionaries expand automatically when full. Note that
* if dict_auto_expand is true, dict_put, dict_copy, dict_resize, and
* dict_grow cannot return e_dictfull; however, they can return e_VMerror.
* (dict_find can return e_dictfull even if dict_auto_expand is true.)
*/
extern bool dict_auto_expand;
/* Create a dictionary. */
int dict_create(P2(uint maxlength, ref *pdref));
/* Return a pointer to a ref that holds the access attributes */
/* for a dictionary. */
#define dict_access_ref(pdref) (&(pdref)->value.pdict->values)
#define check_dict_read(dref) check_read(*dict_access_ref(&dref))
#define check_dict_write(dref) check_write(*dict_access_ref(&dref))
/*
* Look up a key in a dictionary. Store a pointer to the value slot
* where found, or to the (value) slot for inserting.
* Return 1 if found, 0 if not and there is room for a new entry,
* or e_dictfull if the dictionary is full and the key is missing.
* The caller is responsible for ensuring that key is not a null.
*/
int dict_find(P3(const ref *pdref, const ref *key, ref **ppvalue));
/*
* Look up a (constant) C string in a dictionary.
* Return 1 if found, <= 0 if not.
*/
int dict_find_string(P3(const ref *pdref, const char _ds *kstr,
ref **ppvalue));
/*
* Enter a key-value pair in a dictionary.
* Return 1 if this was a new entry, 0 if this replaced an existing entry,
* e_dictfull, e_invalidaccess, or e_VMerror if the key was a string
* and a VMerror occurred when converting it to a name.
*/
int dict_put(P3(ref *pdref, const ref *key, const ref *pvalue));
/*
* Enter a key-value pair where the key is a (constant) C string.
*/
int dict_put_string(P3(ref *pdref, const char *kstr, const ref *pvalue));
/* Remove a key-value pair from a dictionary. */
/* Return 0 or e_undefined. */
int dict_undef(P2(ref *pdref, const ref *key));
/* Return the number of elements in a dictionary. */
uint dict_length(P1(const ref *pdref));
/* Return the capacity of a dictionary. */
uint dict_maxlength(P1(const ref *pdref));
/* Copy one dictionary into another. */
/* Return 0 or e_dictfull. */
int dict_copy(P2(const ref *dfrom, ref *dto));
/* Grow or shrink a dictionary. */
/* Return 0, e_dictfull, or e_VMerror. */
int dict_resize(P2(ref *pdref, uint newmaxlength));
/* Grow a dictionary in the same way as dict_put does. */
/* We export this for some special-case code in zop_def. */
int dict_grow(P1(ref *pdref));
/* Ensure that a dictionary uses the unpacked representation for keys. */
/* (This is of no interest to ordinary clients.) */
int dict_unpack(P1(ref *pdref));
/* Prepare to enumerate a dictionary. */
/* Return an integer suitable for the first call to dict_next. */
int dict_first(P1(const ref *pdref));
/* Enumerate the next element of a dictionary. */
/* index is initially the result of a call on dict_first. */
/* Either store a key and value at eltp[0] and eltp[1] */
/* and return an updated index, or return -1 */
/* to signal that there are no more elements in the dictionary. */
int dict_next(P3(const ref *pdref, int index, ref *eltp));
/* Given a value pointer return by dict_find, return an index that */
/* identifies the entry within the dictionary. (This may, but need not, */
/* be the same as the index returned by dict_next.) */
/* The index is in the range [0..maxlength-1]. */
int dict_value_index(P2(const ref *pdref, const ref *pvalue));
/* Given an index in [0..maxlength-1], as returned by dict_value_index, */
/* return the key and value, as returned by dict_next. */
/* If the index designates an unoccupied entry, return e_undefined. */
int dict_index_entry(P3(const ref *pdref, int index, ref *eltp));