#ifndef _PDFOBJ_H_
#define _PDFOBJ_H_
#include <stdio.h>
#define PDF_BOOLEAN 1
#define PDF_NUMBER 2
#define PDF_STRING 3
#define PDF_NAME 4
#define PDF_ARRAY 5
#define PDF_DICT 6
#define PDF_STREAM 7
#define PDF_NULL 8
#define PDF_INDIRECT 9
#define PDF_UNDEFINED 10
#define PDF_OBJ_INVALID 0
#define STREAM_COMPRESS (1 << 0)
#define PDF_OBJ_MAX_DEPTH 30
typedef struct pdf_obj pdf_obj;
typedef struct pdf_file pdf_file;
extern int pdf_obj_get_verbose (void);
extern void texpdf_obj_set_verbose (void);
extern void texpdf_error_cleanup (void);
extern void pdf_out_init (const char *filename, int do_encryption);
extern void pdf_out_flush (void);
extern void texpdf_set_version (unsigned version);
extern unsigned texpdf_get_version (void);
extern void texpdf_release_obj (pdf_obj *object);
extern int texpdf_obj_typeof (pdf_obj *object);
#define PDF_OBJ_NUMBERTYPE(o) ((o) && texpdf_obj_typeof((o)) == PDF_NUMBER)
#define PDF_OBJ_BOOLEANTYPE(o) ((o) && texpdf_obj_typeof((o)) == PDF_BOOLEAN)
#define PDF_OBJ_STRINGTYPE(o) ((o) && texpdf_obj_typeof((o)) == PDF_STRING)
#define PDF_OBJ_NAMETYPE(o) ((o) && texpdf_obj_typeof((o)) == PDF_NAME)
#define PDF_OBJ_ARRAYTYPE(o) ((o) && texpdf_obj_typeof((o)) == PDF_ARRAY)
#define PDF_OBJ_NULLTYPE(o) ((o) && texpdf_obj_typeof((o)) == PDF_NULL)
#define PDF_OBJ_DICTTYPE(o) ((o) && texpdf_obj_typeof((o)) == PDF_DICT)
#define PDF_OBJ_STREAMTYPE(o) ((o) && texpdf_obj_typeof((o)) == PDF_STREAM)
#define PDF_OBJ_INDIRECTTYPE(o) ((o) && texpdf_obj_typeof((o)) == PDF_INDIRECT)
#define PDF_OBJ_UNDEFINED(o) ((o) && texpdf_obj_typeof((o)) == PDF_UNDEFINED)
#define PDF_OBJ_TYPEOF(o) texpdf_obj_typeof((o))
extern pdf_obj *texpdf_ref_obj (pdf_obj *object);
extern pdf_obj *texpdf_link_obj (pdf_obj *object);
extern void pdf_transfer_label (pdf_obj *dst, pdf_obj *src);
extern pdf_obj *texpdf_new_undefined (void);
extern pdf_obj *texpdf_new_null (void);
extern pdf_obj *texpdf_new_boolean (char value);
extern char pdf_boolean_value (pdf_obj *object);
extern pdf_obj *texpdf_new_number (double value);
extern void texpdf_set_number (pdf_obj *object, double value);
extern double texpdf_number_value (pdf_obj *number);
extern pdf_obj *texpdf_new_string (const void *str, unsigned length);
extern void texpdf_set_string (pdf_obj *object, unsigned char *str, unsigned length);
extern void *texpdf_string_value (pdf_obj *object);
extern unsigned texpdf_string_length (pdf_obj *object);
extern pdf_obj *texpdf_new_name (const char *name);
extern char *texpdf_name_value (pdf_obj *object);
extern pdf_obj *texpdf_new_array (void);
extern void texpdf_add_array (pdf_obj *array, pdf_obj *object);
#if 0#endif
extern pdf_obj *texpdf_get_array (pdf_obj *array, long idx);
extern unsigned texpdf_array_length (pdf_obj *array);
#if 0#endif
extern pdf_obj *texpdf_new_dict (void);
extern void texpdf_remove_dict (pdf_obj *dict, const char *key);
extern void texpdf_merge_dict (pdf_obj *dict1, pdf_obj *dict2);
extern pdf_obj *texpdf_lookup_dict (pdf_obj *dict, const char *key);
extern pdf_obj *pdf_dict_keys (pdf_obj *dict);
extern int texpdf_add_dict (pdf_obj *dict, pdf_obj *key, pdf_obj *value);
#if 0#endif
extern int texpdf_foreach_dict (pdf_obj *dict,
int (*proc) (pdf_obj *, pdf_obj *, void *),
void *pdata);
extern pdf_obj *texpdf_new_stream (int flags);
extern void texpdf_add_stream (pdf_obj *stream,
const void *stream_data_ptr,
long stream_data_len);
#if HAVE_ZLIB
extern int texpdf_add_stream_flate (pdf_obj *stream,
const void *stream_data_ptr,
long stream_data_len);
#endif
extern int pdf_concat_stream (pdf_obj *dst, pdf_obj *src);
extern pdf_obj *texpdf_stream_dict (pdf_obj *stream);
extern long pdf_stream_length (pdf_obj *stream);
#if 0#endif
extern const void *pdf_stream_dataptr (pdf_obj *stream);
#if 0#endif
extern int pdf_compare_reference (pdf_obj *ref1, pdf_obj *ref2);
extern void texpdf_set_compression (int level);
extern void texpdf_set_info (pdf_obj *obj);
extern void texpdf_set_root (pdf_obj *obj);
extern void texpdf_set_id (pdf_obj *id);
extern void texpdf_set_encrypt (pdf_obj *encrypt);
extern void texpdf_files_init (void);
extern void texpdf_files_close (void);
extern int texpdf_check_for_pdf (FILE *file);
extern pdf_file *texpdf_open (const char *ident, FILE *file);
extern void texpdf_close (pdf_file *pf);
extern pdf_obj *pdf_file_get_trailer (pdf_file *pf);
extern int texpdf_file_get_version (pdf_file *pf);
extern pdf_obj *pdf_file_get_catalog (pdf_file *pf);
extern pdf_obj *pdf_deref_obj (pdf_obj *object);
extern pdf_obj *pdf_import_object (pdf_obj *object);
extern int pdfobj_escape_str (char *buffer, int size, const unsigned char *s, int len);
extern pdf_obj *texpdf_new_indirect (pdf_file *pf, unsigned long label, unsigned short generation);
#endif