2
Copyright (C) 1994 M. Hagiya, W. Schelter, T. Yuasa
4
This file is part of GNU Common Lisp, herein referred to as GCL
6
GCL is free software; you can redistribute it and/or modify it under
7
the terms of the GNU LIBRARY GENERAL PUBLIC LICENSE as published by
8
the Free Software Foundation; either version 2, or (at your option)
11
GCL is distributed in the hope that it will be useful, but WITHOUT
12
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
14
License for more details.
16
You should have received a copy of the GNU Library General Public License
17
along with GCL; see the file COPYING. If not, write to the Free Software
18
Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
23
IMPLEMENTATION-DEPENDENT
25
The specification of printf may be dependent on the C library,
26
especially for read-write access, append access, etc.
27
The file also contains the code to reclaim the I/O buffer
28
by accessing the FILE structure of C.
29
It also contains read_fasl_data.
35
#include <sys/types.h>
42
#include <readline/readline.h>
43
#define kclgetc(FP) rl_getc_em(FP)
44
#define kclungetc(C, FP) rl_ungetc_em(C, FP)
45
#define kclputc(C, FP) rl_putc_em(C, FP)
47
#define kclgetc(FP) getc(FP)
48
#define kclungetc(C, FP) ungetc(C, FP)
49
#define kclputc(C, FP) putc(C, FP)
50
#endif /* HAVE_READLINE */
52
#define xkclfeof(c,FP) feof(FP)
78
#define a_trsize rtsize
79
#define a_drsize rdsize
82
#if defined(HAVE_ELF_H)
84
#elif defined(HAVE_ELF_ABI_H)
89
# include <sys/socket.h>
90
# include <netinet/in.h>
91
# include <arpa/inet.h>
94
# include <winsock2.h>
98
extern void tcpCloseSocket (int fd);
106
object sSAignore_eof_on_terminal_ioA;
114
if (readline_on && fp==rl_instream && rl_line_buffer && *rl_line_buffer==EOF)
119
if (fp == terminal_io->sm.sm_object0->sm.sm_fp) {
120
if (symbol_value(sSAignore_eof_on_terminal_ioA) == Cnil)
123
fp = freopen("/dev/tty", "r", fp);
129
error("can't reopen the console");
142
FEerror("Unexpected end of ~S.", 1, strm);
146
Input_stream_p(strm) answers
147
if stream strm is an input stream or not.
148
It does not check if it really is possible to read
150
but only checks the mode of the stream (sm_mode).
157
switch (strm->sm.sm_mode) {
172
strm = symbol_value(strm->sm.sm_object0);
173
if (type_of(strm) != t_stream)
174
FEwrong_type_argument(sLstream, strm);
180
case smm_concatenated:
189
case smm_string_input:
192
case smm_string_output:
196
error("illegal stream mode");
202
Output_stream_p(strm) answers
203
if stream strm is an output stream.
204
It does not check if it really is possible to write
206
but only checks the mode of the stream (sm_mode).
209
output_stream_p(strm)
213
switch (strm->sm.sm_mode) {
228
strm = symbol_value(strm->sm.sm_object0);
229
if (type_of(strm) != t_stream)
230
FEwrong_type_argument(sLstream, strm);
236
case smm_concatenated:
245
case smm_string_input:
248
case smm_string_output:
252
error("illegal stream mode");
258
stream_element_type(strm)
264
switch (strm->sm.sm_mode) {
269
return(strm->sm.sm_object0);
272
return (sLstring_char);
275
strm = symbol_value(strm->sm.sm_object0);
276
if (type_of(strm) != t_stream)
277
FEwrong_type_argument(sLstream, strm);
281
x = strm->sm.sm_object0;
284
return(stream_element_type(x->c.c_car));
286
case smm_concatenated:
287
x = strm->sm.sm_object0;
290
return(stream_element_type(x->c.c_car));
293
return(stream_element_type(STREAM_INPUT_STREAM(strm)));
296
return(stream_element_type(STREAM_INPUT_STREAM(strm)));
298
case smm_string_input:
299
return(sLstring_char);
301
case smm_string_output:
302
return(sLstring_char);
305
error("illegal stream mode");
312
setup_stream_buffer(object x) {
313
char *buf=alloc_contblock(BUFSIZ);
314
x->sm.sm_buffer = buf;
315
setbuf(x->sm.sm_fp, buf);
319
deallocate_stream_buffer(strm)
323
/* SGC contblock pages: Its possible this is on an old page CM 20030827 */
324
if (strm->sm.sm_buffer)
327
insert_maybe_sgc_contblock(strm->sm.sm_buffer, BUFSIZ);
329
insert_contblock(strm->sm.sm_buffer, BUFSIZ);
331
strm->sm.sm_buffer = 0;}
333
printf("no buffer? %p \n",strm->sm.sm_fp);
335
#ifndef FCLOSE_SETBUF_OK
336
strm->sm.sm_fp->_base = NULL;
339
/* end ifndef NO_SETBUF */
342
DEFVAR("*ALLOW-GZIPPED-FILE*",sSAallow_gzipped_fileA,SI,sLnil,"");
345
too_long_file_name(object);
349
cannot_create(object);
351
Open_stream(fn, smm, if_exists, if_does_not_exist)
352
opens file fn with mode smm.
356
open_stream(fn, smm, if_exists, if_does_not_exist)
359
object if_exists, if_does_not_exist;
369
if (type_of(fn) != t_string)
370
FEwrong_type_argument(sLstring, fn);
372
if (fn->st.st_fillp > BUFSIZ - 1)
373
too_long_file_name(fn);
374
for (i = 0; i < fn->st.st_fillp; i++)
375
fname[i] = fn->st.st_self[i];
378
if (smm == smm_input || smm == smm_probe) {
380
fp = popen(fname+1,"r");
382
fp = fopen_not_dir(fname, "r");
386
if (sSAallow_gzipped_fileA->s.s_dbind != sLnil)
390
if (snprintf(buf,sizeof(buf),"%s.gz",fname)<=0)
391
FEerror("Cannot write .gz filename",0);
393
st.st_dim=st.st_fillp=strlen(buf);
394
set_type_of(&st,t_string);
395
if (file_exists((object)&st)) {
399
FEerror("Cannot create temporary file",0);
400
if (snprintf(buf,sizeof(buf),"zcat %s.gz",fname)<=0)
401
FEerror("Cannot write zcat pipe name",0);
402
if (!(pp=popen(buf,"r")))
403
FEerror("Cannot open zcat pipe",0);
404
while((n=fread(buf,1,sizeof(buf),pp)))
405
if (!fwrite(buf,1,n,fp))
406
FEerror("Cannot write pipe output to temporary file",0);
408
FEerror("Cannot close zcat pipe",0);
409
if (fseek(fp,0,SEEK_SET))
410
FEerror("Cannot rewind temporary file\n",0);
415
/* fp = fopen_not_dir(buf,"r"); */
418
/* #ifdef NO_MKSTEMP */
423
/* char command [500]; */
425
/* #ifdef NO_MKSTEMP */
426
/* tmp = tmpnam(0); */
428
/* snprintf(tmp,sizeof(tmp),"uzipXXXXXX"); */
429
/* mkstemp(tmp); */ /* fixme: catch errors */
431
/* unzipped = make_simple_string(tmp); */
432
/* sprintf(command,"gzip -dc %s > %s",buf,tmp); */
434
/* if (0 == system(command)) */
436
/* fp = fopen_not_dir(tmp,"r"); */
439
/* /\* should not get here *\/ */
440
/* else { unlink(tmp);}} */
442
if (if_does_not_exist == sKerror)
444
else if (if_does_not_exist == sKcreate) {
445
fp = fopen_not_dir(fname, "w");
449
fp = fopen_not_dir(fname, "r");
452
} else if (if_does_not_exist == Cnil)
455
FEerror("~S is an illegal IF-DOES-NOT-EXIST option.",
456
1, if_does_not_exist);
458
} else if (smm == smm_output || smm == smm_io) {
459
if (if_exists == sKnew_version && if_does_not_exist == sKcreate)
461
fp = fopen_not_dir(fname, "r");
464
if (if_exists == sKerror)
465
FEerror("The file ~A already exists.", 1, fn);
466
else if (if_exists == sKrename) {
467
if (smm == smm_output)
468
fp = backup_fopen(fname, "w");
470
fp = backup_fopen(fname, "w+");
473
} else if (if_exists == sKrename_and_delete ||
474
if_exists == sKnew_version ||
475
if_exists == sKsupersede) {
476
if (smm == smm_output)
477
fp = fopen_not_dir(fname, "w");
479
fp = fopen_not_dir(fname, "w+");
482
} else if (if_exists == sKoverwrite) {
483
fp = fopen_not_dir(fname, "r+");
486
} else if (if_exists == sKappend) {
487
if (smm == smm_output)
488
fp = fopen_not_dir(fname, "a");
490
fp = fopen_not_dir(fname, "a+");
492
FEerror("Cannot append to the file ~A.",1,fn);
493
} else if (if_exists == Cnil)
496
FEerror("~S is an illegal IF-EXISTS option.",
499
if (if_does_not_exist == sKerror)
500
FEerror("The file ~A does not exist.", 1, fn);
501
else if (if_does_not_exist == sKcreate) {
503
if (smm == smm_output)
506
fp = popen(fname+1,"w");
508
fp = fopen_not_dir(fname, "w");
511
fp = fopen_not_dir(fname, "w+");
514
} else if (if_does_not_exist == Cnil)
517
FEerror("~S is an illegal IF-DOES-NOT-EXIST option.",
518
1, if_does_not_exist);
521
error("illegal stream mode");
522
x = alloc_object(t_stream);
523
x->sm.sm_mode = (short)smm;
527
x->sm.sm_object0 = (unzipped ? make_cons(sSAallow_gzipped_fileA,unzipped) : sLstring_char);
528
x->sm.sm_object1 = fn;
529
x->sm.sm_int0 = x->sm.sm_int1 = 0;
531
setup_stream_buffer(x);
537
gclFlushSocket(object);
539
Close_stream(strm) closes stream strm.
540
The abort_flag is not used now.
545
/*bool abort_flag; */ /* Not used now! */
550
switch (strm->sm.sm_mode) {
552
if (strm->sm.sm_fp == stdout)
553
FEerror("Cannot close the standard output.", 0);
554
if (strm->sm.sm_fp == NULL) break;
555
fflush(strm->sm.sm_fp);
556
deallocate_stream_buffer(strm);
557
fclose(strm->sm.sm_fp);
558
strm->sm.sm_fp = NULL;
563
if (SOCKET_STREAM_FD(strm) < 2) {
564
fprintf(stderr,"tried Clsing %d ! as scoket \n",SOCKET_STREAM_FD(strm));
569
if (GET_STREAM_FLAG(strm,gcl_sm_output))
571
gclFlushSocket(strm);
572
/* there are two for one fd so close only one */
573
tcpCloseSocket(SOCKET_STREAM_FD(strm));
576
SOCKET_STREAM_FD(strm)=-1;
580
if (strm->sm.sm_fp == stdin)
581
FEerror("Cannot close the standard input.", 0);
585
if (strm->sm.sm_fp == NULL) break;
586
deallocate_stream_buffer(strm);
587
if (strm->sm.sm_object1 &&
588
type_of(strm->sm.sm_object1)==t_string &&
589
strm->sm.sm_object1->st.st_self[0] =='|')
590
pclose(strm->sm.sm_fp);
592
fclose(strm->sm.sm_fp);
593
strm->sm.sm_fp = NULL;
594
if (type_of(strm->sm.sm_object0 ) == t_cons &&
595
Mcar(strm->sm.sm_object0 ) == sSAallow_gzipped_fileA)
596
fLdelete_file(Mcdr(strm->sm.sm_object0));
600
strm = symbol_value(strm->sm.sm_object0);
601
if (type_of(strm) != t_stream)
602
FEwrong_type_argument(sLstream, strm);
606
for (x = strm->sm.sm_object0; !endp(x); x = x->c.c_cdr)
607
close_stream(x->c.c_car);
610
case smm_concatenated:
611
for (x = strm->sm.sm_object0; !endp(x); x = x->c.c_cdr)
612
close_stream(x->c.c_car);
617
close_stream(STREAM_INPUT_STREAM(strm));
618
close_stream(STREAM_OUTPUT_STREAM(strm));
621
case smm_string_input:
622
break; /* There is nothing to do. */
624
case smm_string_output:
625
break; /* There is nothing to do. */
628
error("illegal stream mode");
633
make_two_way_stream(istrm, ostrm)
638
strm = alloc_object(t_stream);
639
strm->sm.sm_mode = (short)smm_two_way;
640
strm->sm.sm_fp = NULL;
641
strm->sm.sm_buffer = 0;
642
STREAM_INPUT_STREAM(strm) = istrm;
643
STREAM_OUTPUT_STREAM(strm) = ostrm;
644
strm->sm.sm_int0 = strm->sm.sm_int1 = 0;
649
make_echo_stream(istrm, ostrm)
654
strm = make_two_way_stream(istrm, ostrm);
655
strm->sm.sm_mode = (short)smm_echo;
660
make_string_input_stream(strng, istart, iend)
666
strm = alloc_object(t_stream);
667
strm->sm.sm_mode = (short)smm_string_input;
668
strm->sm.sm_fp = NULL;
669
strm->sm.sm_buffer = 0;
670
STRING_STREAM_STRING(strm) = strng;
671
strm->sm.sm_object1 = OBJNULL;
672
STRING_INPUT_STREAM_NEXT(strm)= istart;
673
STRING_INPUT_STREAM_END(strm)= iend;
677
DEFUN_NEW("STRING-INPUT-STREAM-P",object,fSstring_input_stream_p,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") {
678
return type_of(x)==t_stream && x->sm.sm_mode == (short)smm_string_input ? Ct : Cnil;
680
DEFUN_NEW("STRING-OUTPUT-STREAM-P",object,fSstring_output_stream_p,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") {
681
return type_of(x)==t_stream && x->sm.sm_mode == (short)smm_string_output ? Ct : Cnil;
685
make_string_output_stream(line_length)
691
strng = alloc_object(t_string);
692
strng->st.st_hasfillp = TRUE;
693
strng->st.st_adjustable = TRUE;
694
strng->st.st_displaced = Cnil;
695
strng->st.st_dim = line_length;
696
strng->st.st_fillp = 0;
697
strng->st.st_self = NULL;
698
/* For GBC not to go mad. */
700
/* Saving for GBC. */
701
strng->st.st_self = alloc_relblock(line_length);
702
strm = alloc_object(t_stream);
703
strm->sm.sm_mode = (short)smm_string_output;
704
strm->sm.sm_fp = NULL;
705
strm->sm.sm_buffer = 0;
706
STRING_STREAM_STRING(strm) = strng;
707
strm->sm.sm_object1 = OBJNULL;
708
strm->sm.sm_int0 = STREAM_FILE_COLUMN(strm) = 0;
714
get_output_stream_string(strm)
719
strng = copy_simple_string(STRING_STREAM_STRING(strm));
720
STRING_STREAM_STRING(strm)->st.st_fillp = 0;
728
closed_stream(object);
736
switch (strm->sm.sm_mode) {
739
return (getCharGclSocket(strm,Ct));
744
if (strm->sm.sm_fp == NULL)
747
c = kclgetc(strm->sm.sm_fp);
749
c = getOneChar(strm->sm.sm_fp);
751
/* if (c == EOF) { */
752
/* if (xkclfeof(c,strm->sm.sm_fp)) */
753
/* end_of_stream(strm); */
754
/* else c = getOneChar(strm->sm.sm_fp); */
755
/* if (c == EOF) end_of_stream(strm); */
759
/* strm->sm.sm_int0++; */
760
return(c==EOF ? c : (c&0377));
763
strm = symbol_value(strm->sm.sm_object0);
764
if (type_of(strm) != t_stream)
765
FEwrong_type_argument(sLstream, strm);
768
case smm_concatenated:
770
if (endp(strm->sm.sm_object0)) {
773
if (stream_at_end(strm->sm.sm_object0->c.c_car)) {
775
= strm->sm.sm_object0->c.c_cdr;
778
c = readc_stream(strm->sm.sm_object0->c.c_car);
783
if (strm == terminal_io)
784
flush_stream(STREAM_OUTPUT_STREAM(terminal_io));
786
/* strm->sm.sm_int1 = 0; */
787
strm = STREAM_INPUT_STREAM(strm);
791
c = readc_stream(STREAM_INPUT_STREAM(strm));
792
if (ECHO_STREAM_N_UNREAD(strm) == 0)
793
writec_stream(c, STREAM_OUTPUT_STREAM(strm));
795
--(ECHO_STREAM_N_UNREAD(strm));
798
case smm_string_input:
799
if (STRING_INPUT_STREAM_NEXT(strm)>= STRING_INPUT_STREAM_END(strm))
801
return(STRING_STREAM_STRING(strm)->st.st_self
802
[STRING_INPUT_STREAM_NEXT(strm)++]);
807
case smm_string_output:
809
#ifdef USER_DEFINED_STREAMS
810
case smm_user_defined:
811
#define STM_DATA_STRUCT 0
812
#define STM_READ_CHAR 1
813
#define STM_WRITE_CHAR 2
814
#define STM_UNREAD_CHAR 7
815
#define STM_FORCE_OUTPUT 4
816
#define STM_PEEK_CHAR 3
821
object *old_vs_base = vs_base;
822
object *old_vs_top = vs_top;
825
super_funcall(strm->sm.sm_object1->str.str_self[STM_READ_CHAR]);
827
vs_base = old_vs_base;
829
if (type_of(val) == t_fixnum)
831
if (type_of(val) == t_character)
832
return (char_code(val));
838
error("illegal stream mode");
844
rl_ungetc_em(int, FILE *);
847
unreadc_stream(int c, object strm) {
849
switch (strm->sm.sm_mode) {
852
ungetCharGclSocket(c,strm);
858
if (strm->sm.sm_fp == NULL)
860
kclungetc(c, strm->sm.sm_fp);
861
/* --strm->sm.sm_int0; */ /* use ftell now for position */
865
strm = symbol_value(strm->sm.sm_object0);
866
if (type_of(strm) != t_stream)
867
FEwrong_type_argument(sLstream, strm);
870
case smm_concatenated:
871
if (endp(strm->sm.sm_object0))
873
strm = strm->sm.sm_object0->c.c_car;
877
strm = STREAM_INPUT_STREAM(strm);
881
unreadc_stream(c, STREAM_INPUT_STREAM(strm));
882
ECHO_STREAM_N_UNREAD(strm)++;
885
case smm_string_input:
886
if (STRING_INPUT_STREAM_NEXT(strm)<= 0)
888
--STRING_INPUT_STREAM_NEXT(strm);
894
case smm_string_output:
897
#ifdef USER_DEFINED_STREAMS
898
case smm_user_defined:
899
{object *old_vs_base = vs_base;
900
object *old_vs_top = vs_top;
903
/* if there is a file pointer and no define unget function,
904
* then call ungetc */
905
if ((strm->sm.sm_fp != NULL ) &&
906
strm->sm.sm_object1->str.str_self[STM_UNREAD_CHAR] == Cnil)
907
kclungetc(c, strm->sm.sm_fp);
909
super_funcall(strm->sm.sm_object1->str.str_self[STM_UNREAD_CHAR]);
911
vs_base = old_vs_base;
916
error("illegal stream mode");
921
FEerror("Cannot unread the stream ~S.", 1, strm);
925
putCharGclSocket(object,int);
927
rl_putc_em(int, FILE *);
929
cannot_write(object);
932
writec_stream(int c, object strm) {
938
switch (strm->sm.sm_mode) {
942
/* strm->sm.sm_int0++; */
944
STREAM_FILE_COLUMN(strm) = 0;
946
STREAM_FILE_COLUMN(strm) = (STREAM_FILE_COLUMN(strm)&~07) + 8;
948
STREAM_FILE_COLUMN(strm)++;
949
if (strm->sm.sm_fp == NULL)
952
if (strm->sm.sm_mode == smm_socket && strm->sm.sm_fd>=0)
953
putCharGclSocket(strm,c);
956
if (!GET_STREAM_FLAG(strm,gcl_sm_had_error))
960
kclputc(c, strm->sm.sm_fp);
966
strm = symbol_value(strm->sm.sm_object0);
967
if (type_of(strm) != t_stream)
968
FEwrong_type_argument(sLstream, strm);
972
for (x = strm->sm.sm_object0; !endp(x); x = x->c.c_cdr)
973
writec_stream(c, x->c.c_car);
977
/* this should be on the actual streams
980
strm->sm.sm_int1 = 0;
982
strm->sm.sm_int1 = (strm->sm.sm_int1&~07) + 8;
986
strm = STREAM_OUTPUT_STREAM(strm);
990
strm = STREAM_OUTPUT_STREAM(strm);
993
case smm_string_output:
994
/* strm->sm.sm_int0++; */
996
STREAM_FILE_COLUMN(strm) = 0;
998
STREAM_FILE_COLUMN(strm) = (STREAM_FILE_COLUMN(strm)&~07) + 8;
1000
STREAM_FILE_COLUMN(strm)++;
1001
x = STRING_STREAM_STRING(strm);
1002
if (x->st.st_fillp >= x->st.st_dim) {
1003
if (!x->st.st_adjustable)
1004
FEerror("The string ~S is not adjustable.",
1006
p = (inheap((long)x->st.st_self) ? alloc_contblock : alloc_relblock)
1007
(x->st.st_dim * 2 + 16);
1008
for (i = 0; i < x->st.st_dim; i++)
1009
p[i] = x->st.st_self[i];
1010
i = x->st.st_dim * 2 + 16;
1011
#define ADIMLIM 16*1024*1024
1013
FEerror("Can't extend the string.", 0);
1015
adjust_displaced(x, p - x->st.st_self);
1017
x->st.st_self[x->st.st_fillp++] = c;
1022
case smm_concatenated:
1023
case smm_string_input:
1026
#ifdef USER_DEFINED_STREAMS
1027
case smm_user_defined:
1028
{object *old_vs_base = vs_base;
1029
object *old_vs_top = vs_top;
1032
vs_push(code_char(c));
1033
super_funcall(strm->sm.sm_object1->str.str_self[2]);
1034
vs_base = old_vs_base;
1035
vs_top = old_vs_top;
1041
error("illegal stream mode");
1047
writestr_stream(s, strm)
1052
writec_stream(*s++, strm);
1056
flush_stream(object strm) {
1060
switch (strm->sm.sm_mode) {
1063
if (strm->sm.sm_fp == NULL)
1064
closed_stream(strm);
1065
fflush(strm->sm.sm_fp);
1069
if (SOCKET_STREAM_FD(strm) >0)
1070
gclFlushSocket(strm);
1073
closed_stream(strm);
1076
strm = symbol_value(strm->sm.sm_object0);
1077
if (type_of(strm) != t_stream)
1078
FEwrong_type_argument(sLstream, strm);
1082
for (x = strm->sm.sm_object0; !endp(x); x = x->c.c_cdr)
1083
flush_stream(x->c.c_car);
1088
strm = STREAM_OUTPUT_STREAM(strm);
1092
case smm_string_output:
1097
case smm_concatenated:
1098
case smm_string_input:
1099
FEerror("Cannot flush the stream ~S.", 1, strm);
1100
#ifdef USER_DEFINED_STREAMS
1101
case smm_user_defined:
1102
{object *old_vs_base = vs_base;
1103
object *old_vs_top = vs_top;
1106
super_funcall(strm->sm.sm_object1->str.str_self[4]);
1107
vs_base = old_vs_base;
1108
vs_top = old_vs_top;
1115
error("illegal stream mode");
1121
stream_at_end(object strm) {
1122
#define NON_CHAR -1000
1123
VOL int c = NON_CHAR;
1126
switch (strm->sm.sm_mode) {
1128
listen_stream(strm);
1129
if (SOCKET_STREAM_FD(strm)>=0)
1134
if (strm->sm.sm_fp == NULL)
1135
closed_stream(strm);
1136
if (isatty(fileno(strm->sm.sm_fp)) && !listen_stream(strm))
1137
return(feof(strm->sm.sm_fp) ? TRUE : FALSE);
1138
{int prev_signals_allowed = signals_allowed;
1140
signals_allowed= sig_at_read;
1141
c = kclgetc(strm->sm.sm_fp);
1142
/* blocking getchar for sockets */
1143
/* if (c==EOF && (strm)->sm.sm_mode ==smm_socket)
1144
c = getOneChar(strm->sm.sm_fp); */
1147
if (c == NON_CHAR) goto AGAIN;
1148
signals_allowed=prev_signals_allowed;}
1150
if (xkclfeof(c,strm->sm.sm_fp))
1153
if (c>=0) kclungetc(c, strm->sm.sm_fp);
1164
strm = symbol_value(strm->sm.sm_object0);
1171
case smm_concatenated:
1173
if (endp(strm->sm.sm_object0))
1175
if (stream_at_end(strm->sm.sm_object0->c.c_car)) {
1177
= strm->sm.sm_object0->c.c_cdr;
1184
if (strm == terminal_io) /**/
1185
flush_stream(terminal_io->sm.sm_object1); /**/
1187
strm = STREAM_INPUT_STREAM(strm);
1191
strm = STREAM_INPUT_STREAM(strm);
1194
case smm_string_input:
1195
if (STRING_INPUT_STREAM_NEXT(strm)>= STRING_INPUT_STREAM_END(strm))
1200
case smm_string_output:
1203
#ifdef USER_DEFINED_STREAMS
1204
case smm_user_defined:
1208
error("illegal stream mode");
1214
#ifdef HAVE_SYS_IOCTL_H
1215
#include <sys/ioctl.h>
1219
#ifdef LISTEN_USE_FCNTL
1224
listen_stream(object strm) {
1228
switch (strm->sm.sm_mode) {
1232
if (SOCKET_STREAM_BUFFER(strm)->ust.ust_fillp>0) return TRUE;
1236
/* struct timeval tv; */
1237
/* FD_ZERO(&fds); */
1238
/* FD_SET(SOCKET_STREAM_FD(strm),&fds); */
1239
/* memset(&tv,0,sizeof(tv)); */
1240
/* return select(SOCKET_STREAM_FD(strm)+1,&fds,NULL,NULL,&tv)>0 ? TRUE : FALSE; */
1242
{ int ch = getCharGclSocket(strm,Cnil);
1243
if (ch == EOF) return FALSE;
1244
else unreadc_stream(ch,strm);
1252
#ifdef HAVE_READLINE
1253
if (readline_on && strm->sm.sm_fp==rl_instream)
1254
return *rl_line_buffer ? TRUE : FALSE;
1256
if (strm->sm.sm_fp == NULL)
1257
closed_stream(strm);
1258
if (feof(strm->sm.sm_fp))
1260
#ifdef LISTEN_FOR_INPUT
1261
LISTEN_FOR_INPUT(strm->sm.sm_fp);
1263
#ifdef LISTEN_USE_FCNTL
1265
FILE *fp = strm->sm.sm_fp;
1268
if (feof(fp)) return TRUE;
1269
orig = fcntl(fileno(fp), F_GETFL);
1270
if (! (orig & O_NONBLOCK ) ) {
1271
res=fcntl(fileno(fp),F_SETFL,orig | O_NONBLOCK);
1274
if (! (orig & O_NONBLOCK ) ){
1275
fcntl(fileno(fp),F_SETFL,orig );
1289
strm = symbol_value(strm->sm.sm_object0);
1290
if (type_of(strm) != t_stream)
1291
FEwrong_type_argument(sLstream, strm);
1294
case smm_concatenated:
1295
if (endp(strm->sm.sm_object0))
1297
strm = strm->sm.sm_object0->c.c_car; /* Incomplete! */
1302
strm = STREAM_INPUT_STREAM(strm);
1305
case smm_string_input:
1306
if (STRING_INPUT_STREAM_NEXT(strm)< STRING_INPUT_STREAM_END(strm))
1314
case smm_string_output:
1315
FEerror("Can't listen to ~S.", 1, strm);
1318
error("illegal stream mode");
1328
switch (strm->sm.sm_mode) {
1332
/* return(strm->sm.sm_int0); */
1333
if (strm->sm.sm_fp == NULL)
1334
closed_stream(strm);
1335
return(ftell(strm->sm.sm_fp));
1340
case smm_string_output:
1341
return(STRING_STREAM_STRING(strm)->st.st_fillp);
1344
strm = symbol_value(strm->sm.sm_object0);
1345
if (type_of(strm) != t_stream)
1346
FEwrong_type_argument(sLstream, strm);
1351
case smm_concatenated:
1354
case smm_string_input:
1358
error("illegal stream mode");
1364
file_position_set(strm, disp)
1369
switch (strm->sm.sm_mode) {
1376
if (fseek(strm->sm.sm_fp, disp, 0) < 0)
1378
/* strm->sm.sm_int0 = disp; */
1381
case smm_string_output:
1382
if (disp < STRING_STREAM_STRING(strm)->st.st_fillp) {
1383
STRING_STREAM_STRING(strm)->st.st_fillp = disp;
1384
/* strm->sm.sm_int0 = disp; */
1386
disp -= STRING_STREAM_STRING(strm)->st.st_fillp;
1388
writec_stream(' ', strm);
1393
strm = symbol_value(strm->sm.sm_object0);
1394
if (type_of(strm) != t_stream)
1395
FEwrong_type_argument(sLstream, strm);
1400
case smm_concatenated:
1403
case smm_string_input:
1407
error("illegal stream mode");
1417
switch (strm->sm.sm_mode) {
1422
if (strm->sm.sm_fp == NULL)
1423
closed_stream(strm);
1424
return(file_len(strm->sm.sm_fp));
1429
strm = symbol_value(strm->sm.sm_object0);
1430
if (type_of(strm) != t_stream)
1431
FEwrong_type_argument(sLstream, strm);
1437
case smm_concatenated:
1440
case smm_string_input:
1441
case smm_string_output:
1445
error("illegal stream mode");
1451
file_column(object strm) {
1456
switch (strm->sm.sm_mode) {
1460
case smm_string_output:
1461
return(STREAM_FILE_COLUMN(strm));
1465
strm=STREAM_OUTPUT_STREAM(strm);
1468
strm = symbol_value(strm->sm.sm_object0);
1469
if (type_of(strm) != t_stream)
1470
FEwrong_type_argument(sLstream, strm);
1476
case smm_string_input:
1479
case smm_concatenated:
1480
if (endp(strm->sm.sm_object0))
1482
strm = strm->sm.sm_object0->c.c_car;
1486
for (x = strm->sm.sm_object0; !endp(x); x = x->c.c_cdr) {
1487
i = file_column(x->c.c_car);
1493
#ifdef USER_DEFINED_STREAMS
1494
case smm_user_defined: /* not right but what is? */
1499
error("illegal stream mode");
1505
load(const char *s) {
1507
object filename, strm, x;
1510
if (user_match(s,strlen(s)))
1512
filename = make_simple_string(s);
1514
strm = open_stream(filename, smm_input, Cnil, sKerror);
1517
preserving_whitespace_flag = FALSE;
1518
detect_eos_flag = TRUE;
1519
x = read_object_non_recursive(strm);
1533
LFD(Lmake_synonym_stream)()
1538
check_type_symbol(&vs_base[0]);
1539
x = alloc_object(t_stream);
1540
x->sm.sm_mode = (short)smm_synonym;
1542
x->sm.sm_buffer = 0;
1543
x->sm.sm_object0 = vs_base[0];
1544
x->sm.sm_object1 = OBJNULL;
1545
x->sm.sm_int0 = x->sm.sm_int1 = 0;
1549
LFD(Lmake_broadcast_stream)()
1554
narg = vs_top - vs_base;
1555
for (i = 0; i < narg; i++)
1556
if (type_of(vs_base[i]) != t_stream ||
1557
!output_stream_p(vs_base[i]))
1558
cannot_write(vs_base[i]);
1560
for (i = narg; i > 0; --i)
1562
x = alloc_object(t_stream);
1563
x->sm.sm_mode = (short)smm_broadcast;
1565
x->sm.sm_buffer = 0;
1566
x->sm.sm_object0 = vs_base[0];
1567
x->sm.sm_object1 = OBJNULL;
1568
x->sm.sm_int0 = x->sm.sm_int1 = 0;
1572
LFD(Lmake_concatenated_stream)()
1577
narg = vs_top - vs_base;
1578
for (i = 0; i < narg; i++)
1579
if (type_of(vs_base[i]) != t_stream ||
1580
!input_stream_p(vs_base[i]))
1581
cannot_read(vs_base[i]);
1583
for (i = narg; i > 0; --i)
1585
x = alloc_object(t_stream);
1586
x->sm.sm_mode = (short)smm_concatenated;
1588
x->sm.sm_buffer = 0;
1589
x->sm.sm_object0 = vs_base[0];
1590
x->sm.sm_object1 = OBJNULL;
1591
x->sm.sm_int0 = x->sm.sm_int1 = 0;
1595
LFD(Lmake_two_way_stream)()
1599
if (type_of(vs_base[0]) != t_stream ||
1600
!input_stream_p(vs_base[0]))
1601
cannot_read(vs_base[0]);
1602
if (type_of(vs_base[1]) != t_stream ||
1603
!output_stream_p(vs_base[1]))
1604
cannot_write(vs_base[1]);
1605
vs_base[0] = make_two_way_stream(vs_base[0], vs_base[1]);
1609
LFD(Lmake_echo_stream)()
1613
if (type_of(vs_base[0]) != t_stream ||
1614
!input_stream_p(vs_base[0]))
1615
cannot_read(vs_base[0]);
1616
if (type_of(vs_base[1]) != t_stream ||
1617
!output_stream_p(vs_base[1]))
1618
cannot_write(vs_base[1]);
1619
vs_base[0] = make_echo_stream(vs_base[0], vs_base[1]);
1623
@(static defun make_string_input_stream (strng &o istart iend)
1626
check_type_string(&strng);
1629
else if (type_of(istart) != t_fixnum)
1634
e = strng->st.st_fillp;
1635
else if (type_of(iend) != t_fixnum)
1639
if (s < 0 || e > strng->st.st_fillp || s > e)
1641
@(return `make_string_input_stream(strng, s, e)`)
1644
FEerror("~S and ~S are illegal as :START and :END~%\
1645
for the string ~S.",
1646
3, istart, iend, strng);
1650
FFN(Lmake_string_output_stream)()
1653
vs_push(make_string_output_stream(64));
1656
LFD(Lget_output_stream_string)()
1660
if (type_of(vs_base[0]) != t_stream ||
1661
(enum smmode)vs_base[0]->sm.sm_mode != smm_string_output)
1662
FEerror("~S is not a string-output stream.", 1, vs_base[0]);
1663
vs_base[0] = get_output_stream_string(vs_base[0]);
1667
(SI:OUTPUT-STREAM-STRING string-output-stream)
1669
extracts the string associated with the given
1670
string-output-stream.
1672
LFD(siLoutput_stream_string)()
1675
if (type_of(vs_base[0]) != t_stream ||
1676
(enum smmode)vs_base[0]->sm.sm_mode != smm_string_output)
1677
FEerror("~S is not a string-output stream.", 1, vs_base[0]);
1678
vs_base[0] = vs_base[0]->sm.sm_object0;
1685
if (type_of(vs_base[0]) == t_stream)
1691
LFD(Linput_stream_p)()
1695
check_type_stream(&vs_base[0]);
1696
if (input_stream_p(vs_base[0]))
1702
LFD(Loutput_stream_p)()
1706
check_type_stream(&vs_base[0]);
1707
if (output_stream_p(vs_base[0]))
1713
LFD(Lstream_element_type)()
1717
check_type_stream(&vs_base[0]);
1718
vs_base[0] = stream_element_type(vs_base[0]);
1721
@(defun close (strm &key abort)
1723
check_type_stream(&strm);
1728
@(static defun open (filename
1729
&key (direction sKinput)
1730
(element_type sLstring_char)
1731
(if_exists Cnil iesp)
1732
(if_does_not_exist Cnil idnesp)
1736
check_type_or_pathname_string_symbol_stream(&filename);
1737
filename = coerce_to_namestring(filename);
1738
if (direction == sKinput) {
1741
if_does_not_exist = sKerror;
1742
} else if (direction == sKoutput) {
1745
if_exists = sKnew_version;
1747
if (if_exists == sKoverwrite ||
1748
if_exists == sKappend)
1749
if_does_not_exist = sKerror;
1751
if_does_not_exist = sKcreate;
1753
} else if (direction == sKio) {
1756
if_exists = sKnew_version;
1758
if (if_exists == sKoverwrite ||
1759
if_exists == sKappend)
1760
if_does_not_exist = sKerror;
1762
if_does_not_exist = sKcreate;
1764
} else if (direction == sKprobe) {
1767
if_does_not_exist = Cnil;
1769
FEerror("~S is an illegal DIRECTION for OPEN.",
1771
strm = open_stream(filename, smm, if_exists, if_does_not_exist);
1772
if (type_of(strm) == t_stream)
1773
strm->sm.sm_object0 = element_type;
1777
@(defun file_position (file_stream &o position)
1780
check_type_stream(&file_stream);
1781
if (position == Cnil) {
1782
i = file_position(file_stream);
1785
@(return `make_fixnum(i)`)
1787
if (position == sKstart)
1789
else if (position == sKend)
1790
i = file_length(file_stream);
1791
else if (type_of(position) != t_fixnum ||
1792
(i = fix((position))) < 0)
1793
FEerror("~S is an illegal file position~%\
1794
for the file-stream ~S.",
1795
2, position, file_stream);
1796
if (file_position_set(file_stream, i) < 0)
1807
check_type_stream(&vs_base[0]);
1808
i = file_length(vs_base[0]);
1812
vs_base[0] = make_fixnum(i);
1815
object sSAload_pathnameA;
1816
DEFVAR("*COLLECT-BINARY-MODULES*",sSAcollect_binary_modulesA,SI,sLnil,"");
1817
DEFVAR("*BINARY-MODULES*",sSAbinary_modulesA,SI,Cnil,"");
1819
@(static defun load (pathname
1820
&key (verbose `symbol_value(sLAload_verboseA)`)
1822
(if_does_not_exist sKerror)
1823
&aux pntype fasl_filename lsp_filename filename
1824
defaults strm stdoutput x
1826
bds_ptr old_bds_top;
1830
check_type_or_pathname_string_symbol_stream(&pathname);
1831
pathname = coerce_to_pathname(pathname);
1832
defaults = symbol_value(Vdefault_pathname_defaults);
1833
defaults = coerce_to_pathname(defaults);
1834
pathname = merge_pathnames(pathname, defaults, sKnewest);
1835
pntype = pathname->pn.pn_type;
1836
filename = coerce_to_namestring(pathname);
1837
if (user_match(filename->st.st_self,filename->st.st_fillp))
1839
old_bds_top=bds_top;
1840
if (pntype == Cnil || pntype == sKwild ||
1841
(type_of(pntype) == t_string &&
1843
string_eq(pntype, FASL_string))) {
1848
pathname->pn.pn_type = FASL_string;
1849
fasl_filename = coerce_to_namestring(pathname);
1851
if (pntype == Cnil || pntype == sKwild ||
1852
(type_of(pntype) == t_string &&
1854
string_eq(pntype, LSP_string))) {
1859
pathname->pn.pn_type = LSP_string;
1860
lsp_filename = coerce_to_namestring(pathname);
1862
if (fasl_filename != Cnil && file_exists(fasl_filename)) {
1863
if (verbose != Cnil) {
1864
SETUP_PRINT_DEFAULT(fasl_filename);
1865
if (file_column(PRINTstream) != 0)
1867
write_str("Loading ");
1868
PRINTescape = FALSE;
1869
write_object(fasl_filename, 0);
1871
CLEANUP_PRINT_DEFAULT;
1872
flush_stream(PRINTstream);
1874
package = symbol_value(sLApackageA);
1875
bds_bind(sLApackageA, package);
1876
bds_bind(sSAload_pathnameA,fasl_filename);
1877
if (sSAcollect_binary_modulesA->s.s_dbind==Ct) {
1878
object _x=sSAbinary_modulesA->s.s_dbind;
1885
sSAbinary_modulesA->s.s_dbind=make_cons(fasl_filename,Cnil);
1887
_y->c.c_cdr=make_cons(fasl_filename,Cnil);
1889
i = fasload(fasl_filename);
1890
if (print != Cnil) {
1891
SETUP_PRINT_DEFAULT(Cnil);
1892
vs_top = PRINTvs_top;
1893
if (file_column(PRINTstream) != 0)
1895
write_str("Fasload successfully ended.");
1897
CLEANUP_PRINT_DEFAULT;
1898
flush_stream(PRINTstream);
1900
bds_unwind(old_bds_top);
1901
if (verbose != Cnil) {
1902
SETUP_PRINT_DEFAULT(fasl_filename);
1903
if (file_column(PRINTstream) != 0)
1905
write_str("Finished loading ");
1906
PRINTescape = FALSE;
1907
write_object(fasl_filename, 0);
1909
CLEANUP_PRINT_DEFAULT;
1910
flush_stream(PRINTstream);
1912
@(return `make_fixnum(i)`)
1914
if (lsp_filename != Cnil && file_exists(lsp_filename)) {
1915
filename = lsp_filename;
1917
if (if_does_not_exist != Cnil)
1918
if_does_not_exist = sKerror;
1920
= open_stream(filename, smm_input, Cnil, if_does_not_exist);
1923
if (verbose != Cnil) {
1924
SETUP_PRINT_DEFAULT(filename);
1925
if (file_column(PRINTstream) != 0)
1927
write_str("Loading ");
1928
PRINTescape = FALSE;
1929
write_object(filename, 0);
1931
CLEANUP_PRINT_DEFAULT;
1932
flush_stream(PRINTstream);
1934
package = symbol_value(sLApackageA);
1935
bds_bind(sSAload_pathnameA,pathname);
1936
bds_bind(sLApackageA, package);
1937
bds_bind(sLAstandard_inputA, strm);
1938
frs_push(FRS_PROTECT, Cnil);
1940
close_stream(strm1);
1943
bds_unwind(old_bds_top);
1944
unwind(nlj_fr, nlj_tag);
1947
preserving_whitespace_flag = FALSE;
1948
detect_eos_flag = TRUE;
1949
x = read_object_non_recursive(strm);
1953
object *base = vs_base, *top = vs_top, *lex = lex_env;
1964
if (print != Cnil) {
1965
SETUP_PRINT_DEFAULT(x);
1968
CLEANUP_PRINT_DEFAULT;
1969
flush_stream(PRINTstream);
1974
bds_unwind(old_bds_top);
1975
if (verbose != Cnil) {
1976
SETUP_PRINT_DEFAULT(filename);
1977
if (file_column(PRINTstream) != 0)
1979
write_str("Finished loading ");
1980
PRINTescape = FALSE;
1981
write_object(filename, 0);
1983
CLEANUP_PRINT_DEFAULT;
1984
flush_stream(PRINTstream);
1990
FFN(siLget_string_input_stream_index)()
1993
check_type_stream(&vs_base[0]);
1994
if ((enum smmode)vs_base[0]->sm.sm_mode != smm_string_input)
1995
FEerror("~S is not a string-input stream.", 1, vs_base[0]);
1996
vs_base[0] = make_fixnum(STRING_INPUT_STREAM_NEXT(vs_base[0]));
1999
LFD(siLmake_string_output_stream_from_string)()
2005
if (type_of(strng) != t_string || !strng->st.st_hasfillp)
2006
FEerror("~S is not a string with a fill-pointer.", 1, strng);
2007
strm = alloc_object(t_stream);
2008
strm->sm.sm_mode = (short)smm_string_output;
2009
strm->sm.sm_fp = NULL;
2010
strm->sm.sm_buffer = 0;
2011
STRING_STREAM_STRING(strm) = strng;
2012
strm->sm.sm_object1 = OBJNULL;
2013
/* strm->sm.sm_int0 = strng->st.st_fillp; */
2014
STREAM_FILE_COLUMN(strm) = 0;
2018
LFD(siLcopy_stream)()
2023
check_type_stream(&vs_base[0]);
2024
check_type_stream(&vs_base[1]);
2027
while (!stream_at_end(in))
2028
writec_stream(readc_stream(in), out);
2038
too_long_file_name(fn)
2041
FEerror("~S is a too long file name.", 1, fn);
2048
FEerror("Cannot open the file ~A.", 1, fn);
2055
FEerror("Cannot create the file ~A.", 1, fn);
2062
FEerror("Cannot read the stream ~S.", 1, strm);
2069
FEerror("Cannot write to the stream ~S.", 1, strm);
2072
#ifdef USER_DEFINED_STREAMS
2073
/* more support for user defined streams */
2075
FFN(siLuser_stream_state)()
2079
if(vs_base[0]->sm.sm_object1)
2080
vs_base[0] = vs_base[0]->sm.sm_object1->str.str_self[0];
2082
FEerror("sLtream data NULL ~S", 1, vs_base[0]);
2090
if (!GET_STREAM_FLAG(strm,gcl_sm_had_error))
2092
SET_STREAM_FLAG(strm,gcl_sm_had_error,1);
2093
FEerror("The stream ~S is already closed.", 1, strm);
2100
/* returns a stream with which one can safely do fwrite to the x->sm.sm_fp
2105
/* coerce stream to one so that x->sm.sm_fp is suitable for fread and fwrite,
2106
Return nil if this is not possible.
2110
coerce_stream(strm,out)
2115
if (type_of(strm) != t_stream)
2116
FEwrong_type_argument(sLstream, strm);
2117
switch (strm->sm.sm_mode){
2119
strm = symbol_value(strm->sm.sm_object0);
2120
if (type_of(strm) != t_stream)
2121
FEwrong_type_argument(sLstream, strm);
2126
if (out)strm = STREAM_OUTPUT_STREAM(strm);
2127
else strm = STREAM_INPUT_STREAM(strm);
2130
if (!out) cannot_read(strm);
2133
if (out) cannot_write(strm);
2136
/* case smm_socket: */
2143
&& (strm->sm.sm_fp == NULL))
2144
closed_stream(strm);
2149
FFN(siLfp_output_stream)()
2151
vs_base[0]=coerce_stream(vs_base[0],1);
2155
FFN(siLfp_input_stream)()
2157
vs_base[0]=coerce_stream(vs_base[0],0);
2161
@(static defun fwrite (vector start count stream)
2165
stream=coerce_stream(stream,1);
2166
if (stream==Cnil) @(return Cnil);
2167
p = vector->ust.ust_self;
2168
beg = ((type_of(start)==t_fixnum) ? fix(start) : 0);
2169
n = ((type_of(count)==t_fixnum) ? fix(count) : (vector->st.st_fillp - beg));
2170
if (fwrite(p+beg,1,n,stream->sm.sm_fp)) @(return Ct);
2174
@(static defun fread (vector start count stream)
2178
stream=coerce_stream(stream,0);
2179
if (stream==Cnil) @(return Cnil);
2180
p = vector->st.st_self;
2181
beg = ((type_of(start)==t_fixnum) ? fix(start) : 0);
2182
n = ((type_of(count)==t_fixnum) ? fix(count) : (vector->st.st_fillp - beg));
2183
if ((n=SAFE_FREAD(p+beg,1,n,stream->sm.sm_fp)))
2184
@(return `make_fixnum(n)`);
2191
#define dprintf(s,arg) \
2192
do {fprintf(stderr,s,arg); \
2196
#define dprintf(s,arg)
2202
putCharGclSocket(strm,ch) -- put one character to a socket
2205
Side Effects: The buffer may be filled, and the fill pointer
2206
of the buffer may be changed.
2209
putCharGclSocket(strm,ch)
2213
object bufp = SOCKET_STREAM_BUFFER(strm);
2216
if (bufp->ust.ust_fillp < bufp->ust.ust_dim) {
2217
dprintf("getchar returns (%c)\n",bufp->ust.ust_self[-1+(bufp->ust.ust_fillp)]);
2218
bufp->ust.ust_self[(bufp->ust.ust_fillp)++]=ch;
2222
gclFlushSocket(strm);
2228
gclFlushSocket(strm)
2232
int fd = SOCKET_STREAM_FD(strm);
2233
object bufp = SOCKET_STREAM_BUFFER(strm);
2237
if (!GET_STREAM_FLAG(strm,gcl_sm_output)
2238
|| GET_STREAM_FLAG(strm,gcl_sm_had_error))
2240
#define AMT_TO_WRITE 500
2241
while(i< bufp->ust.ust_fillp) {
2242
wrote =TcpOutputProc ( fd,
2243
&(bufp->st.st_self[i]),
2244
bufp->ust.ust_fillp-i > AMT_TO_WRITE ? AMT_TO_WRITE : bufp->ust.ust_fillp-i,
2247
, TRUE /* Wild guess as to whether it should block or not */
2251
SET_STREAM_FLAG(strm,gcl_sm_had_error,1);
2253
FEerror("error writing to socket: errno= ~a",1,make_fixnum(err));
2258
bufp->ust.ust_fillp=0;
2263
make_socket_stream(fd,mode,server,host,port,async)
2265
enum gcl_sm_flags mode;
2274
FEerror("Could not connect",0);
2276
x = alloc_object(t_stream);
2277
x->sm.sm_mode = smm_socket;
2278
x->sm.sm_buffer = 0;
2279
x->sm.sm_object0 = list(3,server,host,port);
2280
x->sm.sm_object1 = 0;
2281
x->sm.sm_int0 = x->sm.sm_int1 = 0;
2283
SOCKET_STREAM_FD(x)= fd;
2284
SET_STREAM_FLAG(x,mode,1);
2285
SET_STREAM_FLAG(x,gcl_sm_tcp_async,(async!=Cnil));
2287
if (mode == gcl_sm_output)
2288
{ fp=fdopen(fd,(mode==gcl_sm_input ? "r" : "w"));
2289
if (fp==NULL) FEerror("Could not connect",0);
2291
setup_stream_buffer(x);
2297
buffer=alloc_simple_string((BUFSIZ < 4096 ? 4096 : BUFSIZ));
2298
SOCKET_STREAM_BUFFER(x) =buffer;
2299
buffer->ust.ust_self = alloc_contblock(buffer->st.st_dim);
2300
buffer->ust.ust_fillp = 0;
2310
struct sockaddr_in addr;
2311
object server,host,port;
2313
if (type_of(x) != t_stream)
2314
FEerror("~S is not a steam~%",1,x);
2315
if (x->sm.sm_mode!=smm_two_way)
2316
FEerror("~S is not a two-way steam~%",1,x);
2317
fd=accept(SOCKET_STREAM_FD(STREAM_INPUT_STREAM(x)),(struct sockaddr *)&addr,&n);
2319
FEerror("Error ~S on accepting connection to ~S~%",2,make_simple_string(strerror(errno)),x);
2322
server=STREAM_INPUT_STREAM(x)->sm.sm_object0->c.c_car;
2323
host=STREAM_INPUT_STREAM(x)->sm.sm_object0->c.c_cdr->c.c_car;
2324
port=STREAM_INPUT_STREAM(x)->sm.sm_object0->c.c_cdr->c.c_cdr->c.c_car;
2325
x = make_two_way_stream
2326
(make_socket_stream(fd,gcl_sm_input,server,host,port,Cnil),
2327
make_socket_stream(fd,gcl_sm_output,server,host,port,Cnil));
2334
#include <sys/types.h>
2335
#include <sys/resource.h>
2339
#define on_exit(a,b)
2342
rmc(int e,void *pid) {
2344
kill((long)pid,SIGTERM);
2350
@(static defun socket (port &key host server async myaddr myport daemon)
2352
HOST is a string then connection is made to that
2353
ip or domain address.
2354
SERVER A function to call if this is to be a server
2356
ASYNC socket returned immideiately. read or flush
2357
will block till open if in non blocking mode
2358
MYADDR client's ip address. Useful if have several
2360
MYPORT port to use on client side
2367
char *myaddrPtr=buf1,*hostPtr=buf2;
2370
if (type_of(host) == t_string) {
2371
hostPtr=lisp_copy_to_null_terminated(host,hostPtr,sizeof(buf1));
2372
} else { hostPtr = NULL; }
2374
if (fLfunctionp(server) == Ct) {
2378
if (myaddr != Cnil) {
2379
myaddrPtr=lisp_copy_to_null_terminated(myaddr,myaddrPtr,sizeof(buf2));
2380
} else { myaddrPtr = NULL; }
2381
if (isServer == 0 && hostPtr == NULL) {
2382
FEerror("You must supply at least one of :host hostname or :server function",0);
2385
inPort = (myport == Cnil ? 0 : fix(Iis_fixnum(myport)));
2388
if (isServer && daemon != Cnil) {
2392
struct sigaction sa;
2394
sa.sa_handler=SIG_IGN;
2395
sa.sa_flags=SA_NOCLDWAIT;
2396
sigemptyset(&sa.sa_mask);
2398
sigaction(SIGCHLD,&sa,NULL);
2400
switch((pid=fork())) {
2402
FEerror("Cannot fork", 0);
2407
FEerror("setsid error", 0);
2409
if (daemon == sKpersistent)
2412
FEerror("daemon fork error", 0);
2421
memset(&r,0,sizeof(r));
2422
if (getrlimit(RLIMIT_NOFILE,&r))
2423
FEerror("Cannot get resourse usage",0);
2425
for (i=0;i<r.rlim_cur;i++)
2429
if ((i=open("/dev/null",O_RDWR))==-1)
2430
FEerror("Can't open /dev/null for stdin",0);
2432
FEerror("Can't dup",0);
2434
FEerror("Can't dup twice",0);
2437
FEerror("Cannot chdir to /",0);
2441
fd = CreateSocket(fix(port),hostPtr,isServer,myaddrPtr,inPort,(async!=Cnil));
2443
x = make_two_way_stream
2444
(make_socket_stream(fd,gcl_sm_input,server,host,port,async),
2445
make_socket_stream(fd,gcl_sm_output,server,host,port,async));
2454
i=select(fd+1,&fds,NULL,NULL,NULL);
2460
sigaction(SIGCHLD,&sa,NULL);
2462
switch((pid=fork())) {
2464
ifuncall1(server,y);
2479
if (daemon != sKpersistent) {
2480
on_exit(rmc,(void *)pid);
2492
fd = CreateSocket(fix(port),hostPtr,isServer,myaddrPtr,inPort,(async!=Cnil));
2494
x = make_two_way_stream
2495
(make_socket_stream(fd,gcl_sm_input,server,host,port,async),
2496
make_socket_stream(fd,gcl_sm_output,server,host,port,async));
2504
DEF_ORDINARY("MYADDR",sKmyaddr,KEYWORD,"");
2505
DEF_ORDINARY("MYPORT",sKmyport,KEYWORD,"");
2506
DEF_ORDINARY("ASYNC",sKasync,KEYWORD,"");
2507
DEF_ORDINARY("HOST",sKhost,KEYWORD,"");
2508
DEF_ORDINARY("SERVER",sKserver,KEYWORD,"");
2509
DEF_ORDINARY("DAEMON",sKdaemon,KEYWORD,"");
2510
DEF_ORDINARY("PERSISTENT",sKpersistent,KEYWORD,"");
2511
DEF_ORDINARY("SOCKET",sSsocket,SI,"");
2514
@(static defun accept (x)
2520
#endif /* HAVE_NSOCKET */
2523
DEFVAR("*STANDARD-INPUT*",sLAstandard_inputA,LISP,(gcl_init_file(),standard_io),"");
2524
DEFVAR("*STANDARD-OUTPUT*",sLAstandard_outputA,LISP,standard_io,"");
2525
DEFVAR("*ERROR-OUTPUT*",sLAerror_outputA,LISP,standard_io,"");
2526
DEFVAR("*TERMINAL-IO*",sLAterminal_ioA,LISP,terminal_io,"");
2527
DEFVAR("*QUERY-IO*",sLAquery_ioA,LISP,
2528
(standard_io->sm.sm_object0 = sLAterminal_ioA,
2530
DEFVAR("*DEBUG-IO*",sLAdebug_ioA,LISP,standard_io,"");
2531
DEFVAR("*TRACE-OUTPUT*",sLAtrace_outputA,LISP,standard_io,"");
2537
object standard_input;
2538
object standard_output;
2541
standard_input = alloc_object(t_stream);
2542
standard_input->sm.sm_mode = (short)smm_input;
2543
standard_input->sm.sm_fp = stdin;
2544
standard_input->sm.sm_buffer = 0;
2545
standard_input->sm.sm_object0 = sLstring_char;
2546
standard_input->sm.sm_object1
2548
= make_simple_string("stdin");
2550
standard_input->sm.sm_int0 = 0; /* unused */
2551
standard_input->sm.sm_int1 = 0; /* unused */
2553
standard_output = alloc_object(t_stream);
2554
standard_output->sm.sm_mode = (short)smm_output;
2555
standard_output->sm.sm_fp = stdout;
2556
standard_output->sm.sm_buffer = 0;
2557
standard_output->sm.sm_object0 = sLstring_char;
2558
standard_output->sm.sm_object1
2560
= make_simple_string("stdout");
2562
standard_output->sm.sm_int0 = 0; /* unused */
2563
STREAM_FILE_COLUMN(standard_output) = 0;
2565
terminal_io = standard
2566
= make_two_way_stream(standard_input, standard_output);
2567
enter_mark_origin(&terminal_io);
2569
x = alloc_object(t_stream);
2570
x->sm.sm_mode = (short)smm_synonym;
2572
x->sm.sm_buffer = 0;
2573
x->sm.sm_object0 = sLAterminal_ioA;
2574
x->sm.sm_object1 = OBJNULL;
2575
x->sm.sm_int0 = x->sm.sm_int1 = 0; /* unused */
2577
enter_mark_origin(&standard_io);
2581
DEFVAR("*IGNORE-EOF-ON-TERMINAL-IO*",sSAignore_eof_on_terminal_ioA,SI,Cnil,"");
2582
DEFVAR("*LOAD-PATHNAME*",sSAload_pathnameA,SI,Cnil,"");
2583
DEFVAR("*LOAD-VERBOSE*",sLAload_verboseA,LISP,Ct,"");
2585
DEF_ORDINARY("ABORT",sKabort,KEYWORD,"");
2586
DEF_ORDINARY("APPEND",sKappend,KEYWORD,"");
2587
DEF_ORDINARY("CREATE",sKcreate,KEYWORD,"");
2588
DEF_ORDINARY("DEFAULT",sKdefault,KEYWORD,"");
2589
DEF_ORDINARY("DIRECTION",sKdirection,KEYWORD,"");
2590
DEF_ORDINARY("ELEMENT-TYPE",sKelement_type,KEYWORD,"");
2591
DEF_ORDINARY("ERROR",sKerror,KEYWORD,"");
2592
DEF_ORDINARY("IF-DOES-NOT-EXIST",sKif_does_not_exist,KEYWORD,"");
2593
DEF_ORDINARY("IF-EXISTS",sKif_exists,KEYWORD,"");
2594
DEF_ORDINARY("INPUT",sKinput,KEYWORD,"");
2595
DEF_ORDINARY("IO",sKio,KEYWORD,"");
2596
DEF_ORDINARY("NEW-VERSION",sKnew_version,KEYWORD,"");
2597
DEF_ORDINARY("OUTPUT",sKoutput,KEYWORD,"");
2598
DEF_ORDINARY("OVERWRITE",sKoverwrite,KEYWORD,"");
2599
DEF_ORDINARY("PRINT",sKprint,KEYWORD,"");
2600
DEF_ORDINARY("PROBE",sKprobe,KEYWORD,"");
2601
DEF_ORDINARY("RENAME",sKrename,KEYWORD,"");
2602
DEF_ORDINARY("RENAME-AND-DELETE",sKrename_and_delete,KEYWORD,"");
2603
DEF_ORDINARY("SET-DEFAULT-PATHNAME",sKset_default_pathname,KEYWORD,"");
2604
DEF_ORDINARY("SUPERSEDE",sKsupersede,KEYWORD,"");
2605
DEF_ORDINARY("VERBOSE",sKverbose,KEYWORD,"");
2611
gcl_init_file_function()
2616
FASL_string = make_simple_string("o");
2617
make_si_constant("*EOF*",make_fixnum(EOF));
2622
enter_mark_origin(&FASL_string);
2624
LSP_string = make_simple_string("lsp");
2629
enter_mark_origin(&LSP_string);
2630
make_si_function("FP-INPUT-STREAM", siLfp_input_stream);
2631
make_si_function("FP-OUTPUT-STREAM", siLfp_output_stream);
2633
make_function("MAKE-SYNONYM-STREAM", Lmake_synonym_stream);
2634
make_function("MAKE-BROADCAST-STREAM", Lmake_broadcast_stream);
2635
make_function("MAKE-CONCATENATED-STREAM",
2636
Lmake_concatenated_stream);
2637
make_function("MAKE-TWO-WAY-STREAM", Lmake_two_way_stream);
2638
make_function("MAKE-ECHO-STREAM", Lmake_echo_stream);
2639
make_function("MAKE-STRING-INPUT-STREAM",
2640
Lmake_string_input_stream);
2641
make_function("MAKE-STRING-OUTPUT-STREAM",
2642
Lmake_string_output_stream);
2643
make_function("GET-OUTPUT-STREAM-STRING",
2644
Lget_output_stream_string);
2646
make_si_function("OUTPUT-STREAM-STRING", siLoutput_stream_string);
2647
make_si_function("FWRITE",Lfwrite);
2648
make_si_function("FREAD",Lfread);
2650
make_si_function("SOCKET",Lsocket);
2651
make_si_function("ACCEPT",Laccept);
2653
make_function("STREAMP", Lstreamp);
2654
make_function("INPUT-STREAM-P", Linput_stream_p);
2655
make_function("OUTPUT-STREAM-P", Loutput_stream_p);
2656
make_function("STREAM-ELEMENT-TYPE", Lstream_element_type);
2657
make_function("CLOSE", Lclose);
2659
make_function("OPEN", Lopen);
2661
make_function("FILE-POSITION", Lfile_position);
2662
make_function("FILE-LENGTH", Lfile_length);
2664
make_function("LOAD", Lload);
2666
make_si_function("GET-STRING-INPUT-STREAM-INDEX",
2667
siLget_string_input_stream_index);
2668
make_si_function("MAKE-STRING-OUTPUT-STREAM-FROM-STRING",
2669
siLmake_string_output_stream_from_string);
2670
make_si_function("COPY-STREAM", siLcopy_stream);
2672
#ifdef USER_DEFINED_STREAMS
2673
make_si_function("USER-STREAM-STATE", siLuser_stream_state);
2676
#ifdef HAVE_READLINE
2677
gcl_init_readline_function();
2683
read_fasl_data(const char *str) {
2685
object faslfile, data;
2686
#ifndef SEEK_TO_END_OFILE
2687
#if defined(BSD) && defined(UNIX)
2695
struct filehdr fileheader;
2703
faslfile = make_simple_string(str);
2705
faslfile = open_stream(faslfile, smm_input, Cnil, sKerror);
2708
#ifdef SEEK_TO_END_OFILE
2709
SEEK_TO_END_OFILE(faslfile->sm.sm_fp);
2713
fp = faslfile->sm.sm_fp;
2714
fread(&header, sizeof(header), 1, fp);
2716
header.a_text+header.a_data+
2717
header.a_syms+header.a_trsize+header.a_drsize,
2719
fread(&i, sizeof(i), 1, fp);
2720
fseek(fp, i - sizeof(i), 1);
2724
fp = faslfile->sm.sm_fp;
2725
fread(&fileheader, sizeof(fileheader), 1, fp);
2727
fileheader.f_symptr+fileheader.f_nsyms*SYMESZ,
2729
fread(&i, sizeof(i), 1, fp);
2730
fseek(fp, i - sizeof(i), 1);
2731
while ((i = getc(fp)) == 0)
2737
fp = faslfile->sm.sm_fp;
2738
fread(&header, sizeof(header), 1, fp);
2740
header.a_text+header.a_data+
2741
header.a_syms+header.a_trsize+header.a_drsize,
2745
data = read_fasl_vector(faslfile);
2748
close_stream(faslfile);