diff options
Diffstat (limited to 'gs/src/iscan.h')
-rw-r--r-- | gs/src/iscan.h | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/gs/src/iscan.h b/gs/src/iscan.h new file mode 100644 index 000000000..b315318b4 --- /dev/null +++ b/gs/src/iscan.h @@ -0,0 +1,143 @@ +/* Copyright (C) 1992, 1996 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. +*/ + +/* iscan.h */ +/* Interface to Ghostscript scanner */ +/* Requires gsstruct.h, ostack.h, stream.h */ +#include "sa85x.h" +#include "sstring.h" + +/* + * Define the state of the scanner. Before calling scan_token initially, + * the caller must initialize the state by calling scanner_state_init. + * Most of the state is only used if scanning is suspended because of + * an interrupt or a callout. + * + * We expose the entire state definition to the caller so that + * the state can normally be allocated on the stack. + */ +typedef struct scanner_state_s scanner_state; + +/* + * Define a structure for dynamically growable strings. + * If is_dynamic is true, base/next/limit point to a string on the heap; + * if is_dynamic is false, base/next/limit point either to the local buffer + * or (only while control is inside scan_token) into the source stream buffer. + */ +#define max_comment_line 255 /* max size of an externally processable comment */ +#define max_dsc_line max_comment_line /* backward compatibility */ +#define da_buf_size (max_comment_line + 2) +typedef struct dynamic_area_s { + gs_string str; /* for GC */ + byte *base; + byte *next; + byte *limit; + bool is_dynamic; + byte buf[da_buf_size]; /* initial buffer */ + gs_memory_t *memory; +} dynamic_area; +#define da_size(pda) ((uint)((pda)->limit - (pda)->base)) +typedef dynamic_area _ss *da_ptr; + +/* Define state specific to binary tokens and binary object sequences. */ +typedef struct scan_binary_state_s { + int num_format; + int (*cont)(P3(stream *, ref *, scanner_state *)); + ref bin_array; + uint index; + uint max_array_index; /* largest legal index in objects */ + uint min_string_index; /* smallest legal index in strings */ + uint top_size; + uint size; +} scan_binary_state; + +/* Define the scanner state. */ +struct scanner_state_s { + uint s_pstack; /* stack depth when starting current */ + /* procedure, after pushing old pstack */ + uint s_pdepth; /* pstack for very first { encountered, */ + /* for error recovery */ + bool s_from_string; /* true if string is source of data */ + /* (for Level 1 `\' handling) */ + enum { + scanning_none, + scanning_binary, + scanning_comment, + scanning_name, + scanning_string + } s_scan_type; + dynamic_area s_da; + union sss_ { /* scanning sub-state */ + scan_binary_state binary; /* binary */ + struct sns_ { /* name */ + int s_name_type; /* number of /'s preceding a name */ + bool s_try_number; /* true if should try scanning name */ + /* as number */ + } s_name; + stream_state st; /* string */ + stream_A85D_state a85d; /* string */ + stream_AXD_state axd; /* string */ + stream_PSSD_state pssd; /* string */ + } s_ss; +}; +/* The type descriptor is public only for checking. */ +extern_st(st_scanner_state); +#define public_st_scanner_state() /* in iscan.c */\ + gs_public_st_complex_only(st_scanner_state, scanner_state, "scanner state",\ + scanner_clear_marks, scanner_enum_ptrs, scanner_reloc_ptrs, 0) +#define scanner_state_init(pstate, from_string)\ + ((pstate)->s_scan_type = scanning_none,\ + (pstate)->s_pstack = 0,\ + (pstate)->s_from_string = from_string) + +/* + * Read a token from a stream. As usual, 0 is a normal return, + * <0 is an error. There are also three special return codes: + */ +#define scan_BOS 1 /* binary object sequence */ +#define scan_EOF 2 /* end of stream */ +#define scan_Refill 3 /* get more input data, then call again */ +int scan_token(P3(stream *s, ref *pref, scanner_state *pstate)); + +/* + * Read a token from a string. Return like scan_token, but also + * update the string to move past the token (if no error). + */ +int scan_string_token(P2(ref *pstr, ref *pref)); + +/* + * Handle a scan_Refill return from scan_token. + * This may return o_push_estack, 0 (meaning just call scan_token again), + * or an error code. + */ +int scan_handle_refill(P5(const ref *fop, scanner_state *pstate, bool save, + bool push_file, int (*cont)(P1(os_ptr)))); + +/* + * Define the procedure "hook" for parsing DSC comments. If not NULL, + * this procedure is called for every DSC comment seen by the scanner. + */ +extern int (*scan_dsc_proc)(P2(const byte *, uint)); + +/* + * Define the procedure "hook" for parsing general comments. If not NULL, + * this procedure is called for every comment seen by the scanner. + * If both scan_dsc_proc and scan_comment_proc are set, + * scan_comment_proc is called only for non-DSC comments. + */ +extern int (*scan_comment_proc)(P2(const byte *, uint)); |