Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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 */