Commit | Line | Data |
---|---|---|
0f2d19dd JB |
1 | /* classes: h_files */ |
2 | ||
3 | #ifndef PORTSH | |
4 | #define PORTSH | |
5 | /* Copyright (C) 1995,1996 Free Software Foundation, Inc. | |
6 | * | |
7 | * This program 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 2, or (at your option) | |
10 | * any later version. | |
11 | * | |
12 | * This program 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 this software; see the file COPYING. If not, write to | |
19 | * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | |
20 | * | |
21 | * As a special exception, the Free Software Foundation gives permission | |
22 | * for additional uses of the text contained in its release of GUILE. | |
23 | * | |
24 | * The exception is that, if you link the GUILE library with other files | |
25 | * to produce an executable, this does not by itself cause the | |
26 | * resulting executable to be covered by the GNU General Public License. | |
27 | * Your use of that executable is in no way restricted on account of | |
28 | * linking the GUILE library code into it. | |
29 | * | |
30 | * This exception does not however invalidate any other reasons why | |
31 | * the executable file might be covered by the GNU General Public License. | |
32 | * | |
33 | * This exception applies only to the code released by the | |
34 | * Free Software Foundation under the name GUILE. If you copy | |
35 | * code from other Free Software Foundation releases into a copy of | |
36 | * GUILE, as the General Public License permits, the exception does | |
37 | * not apply to the code that you add in this way. To avoid misleading | |
38 | * anyone as to the status of such modified files, you must delete | |
39 | * this exception notice from them. | |
40 | * | |
41 | * If you write modifications of your own for GUILE, it is your choice | |
42 | * whether to permit this exception to apply to your modifications. | |
43 | * If you do not wish that, delete this exception notice. | |
44 | */ | |
45 | \f | |
46 | ||
b4309c3c | 47 | #include "libguile/__scm.h" |
0f2d19dd JB |
48 | |
49 | \f | |
50 | ||
51 | enum scm_port_representation_type | |
52 | { | |
53 | scm_regular_port, | |
54 | scm_mb_port, | |
55 | scm_wchar_port | |
56 | }; | |
57 | ||
58 | enum scm_string_representation_type | |
59 | { | |
60 | scm_regular_string = scm_regular_port, | |
61 | scm_mb_string = scm_mb_port, | |
62 | scm_wchar_string = scm_wchar_port | |
63 | }; | |
64 | ||
65 | ||
66 | struct scm_port_table | |
67 | { | |
68 | SCM port; /* Open port. */ | |
69 | int revealed; /* 0 not revealed, > 1 revealed. | |
70 | * Revealed ports do not get GC'd. | |
71 | */ | |
72 | ||
73 | SCM stream; | |
ebf7394e | 74 | SCM file_name; /* debugging support. */ |
0f2d19dd JB |
75 | int unchr; /* pushed back character, if any */ |
76 | ||
ebf7394e GH |
77 | int line_number; /* debugging support. */ |
78 | int column_number; /* debugging support. */ | |
0f2d19dd JB |
79 | |
80 | enum scm_port_representation_type representation; | |
81 | }; | |
82 | ||
83 | extern struct scm_port_table **scm_port_table; | |
0f82baf6 | 84 | extern int scm_port_table_size; /* Number of ports in scm_port_table. */ |
0f2d19dd JB |
85 | |
86 | ||
87 | \f | |
88 | ||
89 | /* PORT FLAGS | |
90 | * A set of flags caracterizes a port. | |
91 | */ | |
92 | #define SCM_OPN (1L<<16) /* Is the port open? */ | |
93 | #define SCM_RDNG (2L<<16) /* Is it a readable port? */ | |
94 | #define SCM_WRTNG (4L<<16) /* Is it writable? */ | |
95 | #define SCM_BUF0 (8L<<16) | |
96 | #define SCM_CRDY (32L<<16) /* Should char-ready? return #t? */ | |
97 | ||
98 | /* A mask used to clear the char-ready port flag. */ | |
99 | #define SCM_CUC 0x001fffffL | |
100 | ||
101 | #define SCM_PORTP(x) (SCM_TYP7(x)==scm_tc7_port) | |
102 | #define SCM_OPPORTP(x) (((0x7f | SCM_OPN) & SCM_CAR(x))==(scm_tc7_port | SCM_OPN)) | |
103 | #define SCM_OPINPORTP(x) (((0x7f | SCM_OPN | SCM_RDNG) & SCM_CAR(x))==(scm_tc7_port | SCM_OPN | SCM_RDNG)) | |
104 | #define SCM_OPOUTPORTP(x) (((0x7f | SCM_OPN | SCM_WRTNG) & SCM_CAR(x))==(scm_tc7_port | SCM_OPN | SCM_WRTNG)) | |
105 | #define SCM_FPORTP(x) (SCM_TYP16S(x)==scm_tc7_port) | |
106 | #define SCM_OPFPORTP(x) (((0xfeff | SCM_OPN) & SCM_CAR(x))==(scm_tc7_port | SCM_OPN)) | |
107 | #define SCM_OPINFPORTP(x) (((0xfeff | SCM_OPN | SCM_RDNG) & SCM_CAR(x))==(scm_tc7_port | SCM_OPN | SCM_RDNG)) | |
108 | #define SCM_OPOUTFPORTP(x) (((0xfeff | SCM_OPN | SCM_WRTNG) & SCM_CAR(x))==(scm_tc7_port | SCM_OPN | SCM_WRTNG)) | |
109 | ||
110 | #define SCM_INPORTP(x) (((0x7f | SCM_RDNG) & SCM_CAR(x))==(scm_tc7_port | SCM_RDNG)) | |
111 | #define SCM_OUTPORTP(x) (((0x7f | SCM_WRTNG) & SCM_CAR(x))==(scm_tc7_port | SCM_WRTNG)) | |
112 | #define SCM_OPENP(x) (SCM_OPN & SCM_CAR(x)) | |
113 | #define SCM_CLOSEDP(x) (!SCM_OPENP(x)) | |
114 | #define SCM_PTAB_ENTRY(x) ((struct scm_port_table *)SCM_CDR(x)) | |
115 | #define SCM_SETPTAB_ENTRY(x,ent) SCM_SETCDR ((x), (SCM)(ent)) | |
116 | #define SCM_STREAM(x) SCM_PTAB_ENTRY(x)->stream | |
117 | #define SCM_SETSTREAM(x,s) (SCM_PTAB_ENTRY(x)->stream = s) | |
d14af9f2 | 118 | #define SCM_FILENAME(x) SCM_PTAB_ENTRY(x)->file_name |
0f2d19dd JB |
119 | #define SCM_LINUM(x) SCM_PTAB_ENTRY(x)->line_number |
120 | #define SCM_COL(x) SCM_PTAB_ENTRY(x)->column_number | |
121 | #define SCM_REVEALED(x) SCM_PTAB_ENTRY(x)->revealed | |
122 | #define SCM_SETREVEALED(x,s) (SCM_PTAB_ENTRY(x)->revealed = s) | |
123 | #define SCM_PORT_REPRESENTATION(x) SCM_PTAB_ENTRY(x)->representation | |
124 | #define SCM_SET_PORT_REPRESENTATION(x,s) (SCM_PTAB_ENTRY(x)->representation = s) | |
125 | #define SCM_CRDYP(port) (SCM_CAR(port) & SCM_CRDY) | |
126 | #define SCM_CLRDY(port) {SCM_CAR(port) &= SCM_CUC;} | |
127 | #define SCM_SETRDY(port) {SCM_CAR(port) |= SCM_CRDY;} | |
128 | #define SCM_CUNGET(c,port) {SCM_PTAB_ENTRY(port)->unchr = c; SCM_SETRDY(port);} | |
129 | #define SCM_CGETUN(port) (SCM_PTAB_ENTRY(port)->unchr) | |
130 | ||
131 | #define SCM_INCLINE(port) {SCM_LINUM (port) += 1; SCM_COL (port) = 0;} | |
132 | #define SCM_INCCOL(port) {SCM_COL (port) += 1;} | |
d14af9f2 | 133 | #define SCM_TABCOL(port) {SCM_COL (port) += 8 - SCM_COL (port) % 8;} |
0f2d19dd JB |
134 | |
135 | ||
136 | ||
137 | \f | |
138 | ||
0f82baf6 JB |
139 | typedef struct scm_ptobfuns |
140 | { | |
141 | SCM (*mark) (); | |
142 | int (*free) (); | |
143 | int (*print) (); | |
144 | SCM (*equalp) (); | |
145 | int (*fputc) (); | |
146 | int (*fputs) (); | |
147 | scm_sizet (*fwrite) (); | |
148 | int (*fflush) (); | |
149 | int (*fgetc) (); | |
150 | int (*fclose) (); | |
151 | } scm_ptobfuns; | |
152 | ||
153 | #define SCM_PTOBNUM(x) (0x0ff & (SCM_CAR(x)>>8)); | |
154 | ||
155 | \f | |
156 | ||
0f2d19dd JB |
157 | extern scm_ptobfuns *scm_ptobs; |
158 | extern scm_sizet scm_numptob; | |
159 | extern int scm_port_table_room; | |
160 | ||
161 | \f | |
162 | #ifdef __STDC__ | |
163 | extern SCM scm_markstream (SCM ptr); | |
164 | extern long scm_newptob (scm_ptobfuns *ptob); | |
165 | extern void scm_fflush (SCM port); | |
166 | extern SCM scm_char_ready_p (SCM port); | |
167 | extern SCM scm_ungetc_char_ready_p (SCM port); | |
168 | extern SCM scm_current_input_port (void); | |
169 | extern SCM scm_current_output_port (void); | |
170 | extern SCM scm_current_error_port (void); | |
171 | extern SCM scm_set_current_input_port (SCM port); | |
172 | extern SCM scm_set_current_output_port (SCM port); | |
173 | extern SCM scm_set_current_error_port (SCM port); | |
174 | extern struct scm_port_table * scm_add_to_port_table (SCM port); | |
175 | extern void scm_remove_from_port_table (SCM port); | |
176 | extern SCM scm_pt_size (void); | |
177 | extern SCM scm_pt_member (SCM member); | |
178 | extern int scm_revealed_count (SCM port); | |
179 | extern SCM scm_port_revealed (SCM port); | |
180 | extern SCM scm_set_port_revealed_x (SCM port, SCM rcount); | |
181 | extern SCM scm_close_port (SCM port); | |
5e840c2e | 182 | extern SCM scm_close_all_ports_except (SCM ports); |
0f2d19dd JB |
183 | extern SCM scm_input_port_p (SCM x); |
184 | extern SCM scm_output_port_p (SCM x); | |
185 | extern SCM scm_eof_object_p (SCM x); | |
186 | extern SCM scm_force_output (SCM port); | |
187 | extern SCM scm_read_char (SCM port); | |
188 | extern SCM scm_peek_char (SCM port); | |
189 | extern SCM scm_unread_char (SCM cobj, SCM port); | |
d14af9f2 MD |
190 | extern SCM scm_port_line (SCM port); |
191 | extern SCM scm_port_column (SCM port); | |
192 | extern SCM scm_port_filename (SCM port); | |
193 | extern SCM scm_set_port_filename_x (SCM port, SCM filename); | |
0f2d19dd JB |
194 | extern void scm_prinport (SCM exp, SCM port, char *type); |
195 | extern void scm_ports_prehistory (void); | |
196 | extern SCM scm_void_port (char * mode_str); | |
197 | extern SCM scm_sys_make_void_port (SCM mode); | |
198 | extern void scm_init_ports (void); | |
199 | ||
200 | #else /* STDC */ | |
201 | extern SCM scm_markstream (); | |
202 | extern long scm_newptob (); | |
203 | extern void scm_fflush (); | |
204 | extern SCM scm_char_ready_p (); | |
205 | extern SCM scm_ungetc_char_ready_p (); | |
206 | extern SCM scm_current_input_port (); | |
207 | extern SCM scm_current_output_port (); | |
208 | extern SCM scm_current_error_port (); | |
209 | extern SCM scm_set_current_input_port (); | |
210 | extern SCM scm_set_current_output_port (); | |
211 | extern SCM scm_set_current_error_port (); | |
212 | extern struct scm_port_table * scm_add_to_port_table (); | |
213 | extern void scm_remove_from_port_table (); | |
214 | extern SCM scm_pt_size (); | |
215 | extern SCM scm_pt_member (); | |
216 | extern int scm_revealed_count (); | |
217 | extern SCM scm_port_revealed (); | |
218 | extern SCM scm_set_port_revealed_x (); | |
219 | extern SCM scm_close_port (); | |
5e840c2e | 220 | extern SCM scm_close_all_ports_except (); |
0f2d19dd JB |
221 | extern SCM scm_input_port_p (); |
222 | extern SCM scm_output_port_p (); | |
223 | extern SCM scm_eof_object_p (); | |
224 | extern SCM scm_force_output (); | |
225 | extern SCM scm_read_char (); | |
226 | extern SCM scm_peek_char (); | |
227 | extern SCM scm_unread_char (); | |
d14af9f2 MD |
228 | extern SCM scm_port_line (); |
229 | extern SCM scm_port_column (); | |
230 | extern SCM scm_port_filename (); | |
231 | extern SCM scm_set_port_filename_x (); | |
0f2d19dd JB |
232 | extern void scm_prinport (); |
233 | extern void scm_ports_prehistory (); | |
234 | extern SCM scm_void_port (); | |
235 | extern SCM scm_sys_make_void_port (); | |
236 | extern void scm_init_ports (); | |
237 | ||
238 | #endif /* STDC */ | |
239 | ||
240 | ||
241 | ||
242 | ||
243 | ||
244 | ||
245 | ||
246 | ||
247 | ||
248 | ||
249 | ||
250 | ||
251 | #endif /* PORTSH */ |