/* Copyright (C) 1989, 1990 Aladdin Enterprises.  All rights reserved.
   Distributed by Free Software Foundation, Inc.

This file is part of Ghostscript.

Ghostscript is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY.  No author or distributor accepts responsibility
to anyone for the consequences of using it or for whether it serves any
particular purpose or works at all, unless he says so in writing.  Refer
to the Ghostscript General Public License for full details.

Everyone is granted permission to copy, modify and redistribute
Ghostscript, but only under the conditions described in the Ghostscript
General Public License.  A copy of this license is supposed to have been
given to you along with Ghostscript so you can know your rights and
responsibilities.  It should be in a file named COPYING.  Among other
things, the copyright notice and this notice must be preserved on all
copies.  */

/* name.h */
/* Name table entry structure for Ghostscript */

/* Name structure.  The name table is a simple chained hash table. */
/* There is an optimization to avoid lookup for operator and other */
/* global names. */
struct name_s {
	struct name_s *next;	/* next name in chain or 0 */
	ushort index;
/* In order to pack names into 16 bytes, we use a non-standard */
/* representation for the string, omitting the type_attrs field. */
	ushort string_size;
	byte *string_bytes;
/* pvalue specifies the definition status of the name: */
/*	pvalue == pv_no_defn: no definitions */
#define pv_no_defn ((ref *)0)
/*	pvalue == pv_other: other status */
#define pv_other ((ref *)1)
#define pv_valid(pvalue) ((unsigned long)(pvalue) > 1)
/*	pvalue != pv_no_defn, pvalue != pv_other: pvalue is valid */
	ref *pvalue;		/* if only defined in systemdict */
				/* or userdict, this points to */
				/* the value */
};
/*typedef struct name_s name;*/		/* in ghost.h */

/* Procedures for the name table. */
/* The size argument for name_ref should be a ushort, */
/* but this gets the Apollo compiler confused. */
/* enterflag=-1 means don't enter (return an error if missing); */
/* enterflag=0 means enter if missing, don't copy the string; */
/* enterflag=1 means enter if missing, copy the string. */
extern	int	name_ref(P4(byte *ptr, uint size, ref *pnref, int enterflag));
extern	void	name_string_ref(P2(ref *pnref, ref *psref));
extern	void	name_enter(P2(char *str, ref *pnref));
/* Conversion between names and indices. */
#define name_index(pnref) ((pnref)->index)
extern	void	name_index_ref(P2(uint index /* should be ushort*/,
			          ref *pnref));
