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