summaryrefslogtreecommitdiffstats
path: root/input.h
blob: cb3eee4252f5e224e1b5754bc366cfbe1543cf55 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/* input.h -- Structures and unions used for reading input. */

/* Copyright (C) 1993-2020 Free Software Foundation, Inc.

   This file is part of GNU Bash, the Bourne Again SHell.

   Bash is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   Bash is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with Bash.  If not, see <http://www.gnu.org/licenses/>.
*/

#if !defined (_INPUT_H_)
#define _INPUT_H_

#include "stdc.h"

/* Function pointers can be declared as (Function *)foo. */
#if !defined (_FUNCTION_DEF)
#  define _FUNCTION_DEF
typedef int Function ();
typedef void VFunction ();
typedef char *CPFunction ();		/* no longer used */
typedef char **CPPFunction ();		/* no longer used */
#endif /* _FUNCTION_DEF */

typedef int sh_cget_func_t PARAMS((void));		/* sh_ivoidfunc_t */
typedef int sh_cunget_func_t PARAMS((int));	/* sh_intfunc_t */

enum stream_type {st_none, st_stdin, st_stream, st_string, st_bstream};

#if defined (BUFFERED_INPUT)

/* Possible values for b_flag. */
#undef B_EOF
#undef B_ERROR		/* There are some systems with this define */
#undef B_UNBUFF

#define B_EOF		0x01
#define B_ERROR		0x02
#define B_UNBUFF	0x04
#define B_WASBASHINPUT	0x08
#define B_TEXT		0x10
#define B_SHAREDBUF	0x20	/* shared input buffer */

/* A buffered stream.  Like a FILE *, but with our own buffering and
   synchronization.  Look in input.c for the implementation. */
typedef struct BSTREAM
{
  int	 b_fd;
  char	*b_buffer;		/* The buffer that holds characters read. */
  size_t b_size;		/* How big the buffer is. */
  size_t b_used;		/* How much of the buffer we're using, */
  int	 b_flag;		/* Flag values. */
  size_t b_inputp;		/* The input pointer, index into b_buffer. */
} BUFFERED_STREAM;

#if 0
extern BUFFERED_STREAM **buffers;
#endif

extern int default_buffered_input;
extern int bash_input_fd_changed;

#endif /* BUFFERED_INPUT */

typedef union {
  FILE *file;
  char *string;
#if defined (BUFFERED_INPUT)
  int buffered_fd;
#endif
} INPUT_STREAM;

typedef struct {
  enum stream_type type;
  char *name;
  INPUT_STREAM location;
  sh_cget_func_t *getter;
  sh_cunget_func_t *ungetter;
} BASH_INPUT;

extern BASH_INPUT bash_input;

/* Functions from parse.y whose use directly or indirectly depends on the
   definitions in this file. */
extern void initialize_bash_input PARAMS((void));
extern void init_yy_io PARAMS((sh_cget_func_t *, sh_cunget_func_t *, enum stream_type, const char *, INPUT_STREAM));
extern char *yy_input_name PARAMS((void));
extern void with_input_from_stdin PARAMS((void));
extern void with_input_from_string PARAMS((char *, const char *));
extern void with_input_from_stream PARAMS((FILE *, const char *));
extern void push_stream PARAMS((int));
extern void pop_stream PARAMS((void));
extern int stream_on_stack PARAMS((enum stream_type));
extern char *read_secondary_line PARAMS((int));
extern int find_reserved_word PARAMS((char *));
extern void gather_here_documents PARAMS((void));
extern void execute_variable_command PARAMS((char *, char *));

extern int *save_token_state PARAMS((void));
extern void restore_token_state PARAMS((int *));

/* Functions from input.c */
extern int getc_with_restart PARAMS((FILE *));
extern int ungetc_with_restart PARAMS((int, FILE *));

#if defined (BUFFERED_INPUT)
/* Functions from input.c. */
extern int fd_is_bash_input PARAMS((int));
extern int set_bash_input_fd PARAMS((int));
extern int save_bash_input PARAMS((int, int));
extern int check_bash_input PARAMS((int));
extern int duplicate_buffered_stream PARAMS((int, int));
extern BUFFERED_STREAM *fd_to_buffered_stream PARAMS((int));
extern BUFFERED_STREAM *set_buffered_stream PARAMS((int, BUFFERED_STREAM *));
extern BUFFERED_STREAM *open_buffered_stream PARAMS((char *));
extern void free_buffered_stream PARAMS((BUFFERED_STREAM *));
extern int close_buffered_stream PARAMS((BUFFERED_STREAM *));
extern int close_buffered_fd PARAMS((int));
extern int sync_buffered_stream PARAMS((int));
extern int buffered_getchar PARAMS((void));
extern int buffered_ungetchar PARAMS((int));
extern void with_input_from_buffered_stream PARAMS((int, char *));
#endif /* BUFFERED_INPUT */

#endif /* _INPUT_H_ */