1/* input.h -- Structures and unions used for reading input. */
2
3/* Copyright (C) 1993-2009 Free Software Foundation, Inc.
4
5   This file is part of GNU Bash, the Bourne Again SHell.
6
7   Bash is free software: you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation, either version 3 of the License, or
10   (at your option) any later version.
11
12   Bash is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with Bash.  If not, see <http://www.gnu.org/licenses/>.
19*/
20
21#if !defined (_INPUT_H_)
22#define _INPUT_H_
23
24#include "stdc.h"
25
26/* Function pointers can be declared as (Function *)foo. */
27#if !defined (_FUNCTION_DEF)
28#  define _FUNCTION_DEF
29typedef int Function ();
30typedef void VFunction ();
31typedef char *CPFunction ();		/* no longer used */
32typedef char **CPPFunction ();		/* no longer used */
33#endif /* _FUNCTION_DEF */
34
35typedef int sh_cget_func_t __P((void));		/* sh_ivoidfunc_t */
36typedef int sh_cunget_func_t __P((int));	/* sh_intfunc_t */
37
38enum stream_type {st_none, st_stdin, st_stream, st_string, st_bstream};
39
40#if defined (BUFFERED_INPUT)
41
42/* Possible values for b_flag. */
43#undef B_EOF
44#undef B_ERROR		/* There are some systems with this define */
45#undef B_UNBUFF
46
47#define B_EOF		0x01
48#define B_ERROR		0x02
49#define B_UNBUFF	0x04
50#define B_WASBASHINPUT	0x08
51
52/* A buffered stream.  Like a FILE *, but with our own buffering and
53   synchronization.  Look in input.c for the implementation. */
54typedef struct BSTREAM
55{
56  int	 b_fd;
57  char	*b_buffer;		/* The buffer that holds characters read. */
58  size_t b_size;		/* How big the buffer is. */
59  size_t b_used;		/* How much of the buffer we're using, */
60  int	 b_flag;		/* Flag values. */
61  size_t b_inputp;		/* The input pointer, index into b_buffer. */
62} BUFFERED_STREAM;
63
64#if 0
65extern BUFFERED_STREAM **buffers;
66#endif
67
68extern int default_buffered_input;
69
70#endif /* BUFFERED_INPUT */
71
72typedef union {
73  FILE *file;
74  char *string;
75#if defined (BUFFERED_INPUT)
76  int buffered_fd;
77#endif
78} INPUT_STREAM;
79
80typedef struct {
81  enum stream_type type;
82  char *name;
83  INPUT_STREAM location;
84  sh_cget_func_t *getter;
85  sh_cunget_func_t *ungetter;
86} BASH_INPUT;
87
88extern BASH_INPUT bash_input;
89
90/* Functions from parse.y whose use directly or indirectly depends on the
91   definitions in this file. */
92extern void initialize_bash_input __P((void));
93extern void init_yy_io __P((sh_cget_func_t *, sh_cunget_func_t *, enum stream_type, const char *, INPUT_STREAM));
94extern char *yy_input_name __P((void));
95extern void with_input_from_stdin __P((void));
96extern void with_input_from_string __P((char *, const char *));
97extern void with_input_from_stream __P((FILE *, const char *));
98extern void push_stream __P((int));
99extern void pop_stream __P((void));
100extern int stream_on_stack __P((enum stream_type));
101extern char *read_secondary_line __P((int));
102extern int find_reserved_word __P((char *));
103extern void gather_here_documents __P((void));
104extern void execute_variable_command __P((char *, char *));
105
106extern int *save_token_state __P((void));
107extern void restore_token_state __P((int *));
108
109/* Functions from input.c */
110extern int getc_with_restart __P((FILE *));
111extern int ungetc_with_restart __P((int, FILE *));
112
113#if defined (BUFFERED_INPUT)
114/* Functions from input.c. */
115extern int fd_is_bash_input __P((int));
116extern int set_bash_input_fd __P((int));
117extern int save_bash_input __P((int, int));
118extern int check_bash_input __P((int));
119extern int duplicate_buffered_stream __P((int, int));
120extern BUFFERED_STREAM *fd_to_buffered_stream __P((int));
121extern BUFFERED_STREAM *set_buffered_stream __P((int, BUFFERED_STREAM *));
122extern BUFFERED_STREAM *open_buffered_stream __P((char *));
123extern void free_buffered_stream __P((BUFFERED_STREAM *));
124extern int close_buffered_stream __P((BUFFERED_STREAM *));
125extern int close_buffered_fd __P((int));
126extern int sync_buffered_stream __P((int));
127extern int buffered_getchar __P((void));
128extern int buffered_ungetchar __P((int));
129extern void with_input_from_buffered_stream __P((int, char *));
130#endif /* BUFFERED_INPUT */
131
132#endif /* _INPUT_H_ */
133