1 /* Copyright (C) 1992, 2000 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: iscan.h,v 1.9 2004/03/19 08:30:16 ray Exp $ */ 18 /* Token scanner state and interface */ 19 /* Requires gsstruct.h, ostack.h, stream.h */ 20 21 #ifndef iscan_INCLUDED 22 # define iscan_INCLUDED 23 24 #include "sa85x.h" 25 #include "sstring.h" 26 27 /* 28 * Define the state of the scanner. Before calling scan_token initially, 29 * the caller must initialize the state by calling scanner_state_init. 30 * Most of the state is only used if scanning is suspended because of 31 * an interrupt or a callout. 32 * 33 * We expose the entire state definition to the caller so that 34 * the state can normally be allocated on the stack. 35 */ 36 #ifndef scanner_state_DEFINED 37 # define scanner_state_DEFINED 38 typedef struct scanner_state_s scanner_state; 39 #endif 40 41 /* 42 * Define a structure for dynamically growable strings. 43 * If is_dynamic is true, base/next/limit point to a string on the heap; 44 * if is_dynamic is false, base/next/limit point either to the local buffer 45 * or (only while control is inside scan_token) into the source stream buffer. 46 */ 47 #define max_comment_line 255 /* max size of an externally processable comment */ 48 #define max_dsc_line max_comment_line /* backward compatibility */ 49 #define da_buf_size (max_comment_line + 2) 50 typedef struct dynamic_area_s { 51 byte *base; 52 byte *next; 53 byte *limit; 54 bool is_dynamic; 55 byte buf[da_buf_size]; /* initial buffer */ 56 gs_memory_t *memory; 57 } dynamic_area; 58 59 #define da_size(pda) ((uint)((pda)->limit - (pda)->base)) 60 typedef dynamic_area *da_ptr; 61 62 /* Define state specific to binary tokens and binary object sequences. */ 63 typedef struct scan_binary_state_s { 64 int num_format; 65 int (*cont)(i_ctx_t *, stream *, ref *, scanner_state *); 66 ref bin_array; 67 uint index; 68 uint max_array_index; /* largest legal index in objects */ 69 uint min_string_index; /* smallest legal index in strings */ 70 uint top_size; 71 uint size; 72 } scan_binary_state; 73 74 /* Define the scanner state. */ 75 struct scanner_state_s { 76 uint s_pstack; /* stack depth when starting current */ 77 /* procedure, after pushing old pstack */ 78 uint s_pdepth; /* pstack for very first { encountered, */ 79 /* for error recovery */ 80 int s_options; 81 enum { 82 scanning_none, 83 scanning_binary, 84 scanning_comment, 85 scanning_name, 86 scanning_string 87 } s_scan_type; 88 dynamic_area s_da; 89 union sss_ { /* scanning sub-state */ 90 scan_binary_state binary; /* binary */ 91 struct sns_ { /* name */ 92 int s_name_type; /* number of /'s preceding a name */ 93 bool s_try_number; /* true if should try scanning name */ 94 /* as number */ 95 } s_name; 96 stream_state st; /* string */ 97 stream_A85D_state a85d; /* string */ 98 stream_AXD_state axd; /* string */ 99 stream_PSSD_state pssd; /* string */ 100 } s_ss; 101 }; 102 103 /* The type descriptor is public only for checking. */ 104 extern_st(st_scanner_state); 105 #define public_st_scanner_state() /* in iscan.c */\ 106 gs_public_st_complex_only(st_scanner_state, scanner_state, "scanner state",\ 107 scanner_clear_marks, scanner_enum_ptrs, scanner_reloc_ptrs, 0) 108 109 /* Initialize a scanner with a given set of options. */ 110 #define SCAN_FROM_STRING 1 /* true if string is source of data */ 111 /* (for Level 1 `\' handling) */ 112 #define SCAN_CHECK_ONLY 2 /* true if just checking for syntax errors */ 113 /* and complete statements (no value) */ 114 #define SCAN_PROCESS_COMMENTS 4 /* return scan_Comment for comments */ 115 /* (all comments or only non-DSC) */ 116 #define SCAN_PROCESS_DSC_COMMENTS 8 /* return scan_DSC_Comment */ 117 #define SCAN_PDF_RULES 16 /* PDF scanning rules (for names) */ 118 #define SCAN_PDF_INV_NUM 32 /* Adobe ignores invalid numbers */ 119 /* This is for compatibility with Adobe */ 120 /* Acrobat Reader */ 121 void scanner_state_init_options(scanner_state *sstate, int options); 122 #define scanner_state_init_check(pstate, from_string, check_only)\ 123 scanner_state_init_options(pstate,\ 124 (from_string ? SCAN_FROM_STRING : 0) |\ 125 (check_only ? SCAN_CHECK_ONLY : 0)) 126 #define scanner_state_init(pstate, from_string)\ 127 scanner_state_init_check(pstate, from_string, false) 128 129 /* 130 * Read a token from a stream. As usual, 0 is a normal return, 131 * <0 is an error. There are also some special return codes: 132 */ 133 #define scan_BOS 1 /* binary object sequence */ 134 #define scan_EOF 2 /* end of stream */ 135 #define scan_Refill 3 /* get more input data, then call again */ 136 #define scan_Comment 4 /* comment, non-DSC if processing DSC */ 137 #define scan_DSC_Comment 5 /* DSC comment */ 138 int scan_token(i_ctx_t *i_ctx_p, stream * s, ref * pref, 139 scanner_state * pstate); 140 141 /* 142 * Read a token from a string. Return like scan_token, but also 143 * update the string to move past the token (if no error). 144 */ 145 int scan_string_token_options(i_ctx_t *i_ctx_p, ref * pstr, ref * pref, 146 int options); 147 #define scan_string_token(i_ctx_p, pstr, pref)\ 148 scan_string_token_options(i_ctx_p, pstr, pref, 0) 149 150 /* 151 * Handle a scan_Refill return from scan_token. 152 * This may return o_push_estack, 0 (meaning just call scan_token again), 153 * or an error code. 154 */ 155 int scan_handle_refill(i_ctx_t *i_ctx_p, const ref * fop, 156 scanner_state * pstate, bool save, bool push_file, 157 op_proc_t cont); 158 159 /* 160 * Define the procedure "hook" for parsing DSC comments. If not NULL, 161 * this procedure is called for every DSC comment seen by the scanner. 162 */ 163 extern int (*scan_dsc_proc) (const byte *, uint); 164 165 /* 166 * Define the procedure "hook" for parsing general comments. If not NULL, 167 * this procedure is called for every comment seen by the scanner. 168 * If both scan_dsc_proc and scan_comment_proc are set, 169 * scan_comment_proc is called only for non-DSC comments. 170 */ 171 extern int (*scan_comment_proc) (const byte *, uint); 172 173 #endif /* iscan_INCLUDED */ 174