File: termio.kl1

package info (click to toggle)
klic 3.003-1.1
  • links: PTS
  • area: main
  • in suites: woody
  • size: 7,068 kB
  • ctags: 6,333
  • sloc: ansic: 101,584; makefile: 3,395; sh: 1,321; perl: 312; exp: 131; tcl: 111; asm: 102; lisp: 4; sed: 1
file content (289 lines) | stat: -rw-r--r-- 10,089 bytes parent folder | download | duplicates (2)
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
/* ---------------------------------------------------------- 
%   (C)1993,1994,1995 Institute for New Generation Computer Technology 
%       (Read COPYRIGHT for detailed information.) 
%   (C)1996, 1997, 1998, 1999 Japan Information Processing Development Center
%       (Read COPYRIGHT-JIPDEC for detailed information.)
----------------------------------------------------------- */
:- module klicio.

klicio(S) :- klicio(S,[]).

klicio([],U) :- close_unix(U).
klicio([stdin(R)|S],U) :-
    send_unix(stdin(RU),U,UT), termin(RU,R), klicio(S,UT).
klicio([stdout(R)|S],U) :-
    send_unix(stdout(RU),U,UT), termout(RU,R), klicio(S,UT).
klicio([stderr(R)|S],U) :-
    send_unix(stderr(RU),U,UT), termout(RU,R), klicio(S,UT).
klicio([string_output(R,Str)|S],U) :-
    string_output(RS,Str,Chars,Chars), termout(normal(RS),R), klicio(S,U).
klicio([string_input(R,Str)|S],U) :- string(Str,L,_) |
    string_input(RS,Str,0,L,0), termin(normal(RS),R), klicio(S,U).
klicio([read_open(Path,R)|S],U) :-
    send_unix(read_open(Path,RU),U,UT), termin(RU,R), klicio(S,UT).
klicio([write_open(Path,R)|S],U) :-
    send_unix(write_open(Path,RU),U,UT), termout(RU,R), klicio(S,UT).
klicio([append_open(Path,R)|S],U) :-
    send_unix(append_open(Path,RU),U,UT), termout(RU,R), klicio(S,UT).
klicio([update_open(Path,R)|S],U) :-
    send_unix(update_open(Path,RU),U,UT), termupdt(RU,R), klicio(S,UT).
klicio([connect(What,R)|S],U) :-
    send_unix(connect(What,RU),U,UT), termupdt(RU,R), klicio(S,UT).
otherwise.
klicio([Msg|S],U) :-
    send_unix(Msg,U,UT), klicio(S,UT).

send_unix(Msg,[],UT) :- unix:unix([Msg|US]), UT=unix(US).
send_unix(Msg,unix(U),UT) :- U=[Msg|US], UT=unix(US).

close_unix([]).
close_unix(unix(U)) :- U=[].

termin(normal(SU),R) :-
    R=normal(SI),
    default_operator_table(Ops),
    in(SI,SU,s(Ops,0)).
otherwise.
termin(R0,R) :- R=R0.

termout(normal(SU),R) :-
    R=normal(SI),
    default_operator_table(Ops),
    out(SI,SU,s(Ops,0)).
otherwise.
termout(R0,R) :- R=R0.

termupdt(normal(SU),R) :-
    R=normal(SI),
    default_operator_table(Ops),
    updt(SI,SU,s(Ops,0)).
otherwise.
termupdt(R0,R) :- R=R0.

in([],U,_Ops) :- U=[].
in([gett(Term)|S],U,Stat) :-
    klic_reader:parse_one_term_reporting_errors(U,Stat,Term,UT),
    in(S,UT,Stat).
in([getwt(Result)|S],U,Stat) :-
    klic_reader:wparse_one_term_reporting_errors(U,Stat,Result,UT),
    in(S,UT,Stat).
in([addop(Op,Type,Prec)|S],U,s(Ops,OnErr)) :-
    addop(Type,Op,Prec,Ops,NewOps),
    in(S,U,s(NewOps,OnErr)).
in([rmop(Op,Type)|S],U,s(Ops,OnErr)) :-
    rmop(Type,Op,Ops,NewOps),
    in(S,U,s(NewOps,OnErr)).
in([on_error(Pred)|S],U,s(Ops,_)) :-
    in(S,U,s(Ops,Pred)).
otherwise.
in([Msg|S],U,Stat) :-
    U=[Msg|UT],
    in(S,UT,Stat).

out([],U,_Ops) :- U=[].
out([nl|S],U,Stat) :-
    U=[putc(10)|UT],
    out(S,UT,Stat).
out([putt(Term)|S],U,Stat) :-
    unparser:unparse(Term,Stat,U,UT),
    out(S,UT,Stat).
out([puttq(Term)|S],U,Stat) :-
    unparser:unparse(Term,Stat,U,UT),
    out(S,UT,Stat).
out([putwt(Term)|S],U,Stat) :-
    unparser:unwparse(Term,Stat,U,UT),
    out(S,UT,Stat).
out([putwtq(Term)|S],U,Stat) :-
    unparser:unwparse(Term,Stat,U,UT),
    out(S,UT,Stat).
out([addop(Op,Type,Prec)|S],U,s(Ops,OnErr)) :-
    addop(Type,Op,Prec,Ops,NewOps),
    out(S,U,s(NewOps,OnErr)).
out([rmop(Op,Type)|S],U,s(Ops,OnErr)) :-
    rmop(Type,Op,Ops,NewOps),
    out(S,U,s(NewOps,OnErr)).
out([on_error(Pred)|S],U,s(Ops,_)) :-
    out(S,U,s(Ops,Pred)).
otherwise.
out([Msg|S],U,s(Ops,OnErr)) :-
    U=[Msg|UT],
    out(S,UT,s(Ops,OnErr)).

updt([],U,_Stat) :- U=[].
updt([nl|S],U,Stat) :-
    U=[putc(10)|UT],
    updt(S,UT,Stat).
updt([gett(Term)|S],U,Stat) :-
    klic_reader:parse_one_term_reporting_errors(U,Stat,Term,UT),
    updt(S,UT,Stat).
updt([getwt(Term)|S],U,Stat) :-
    klic_reader:wparse_one_term_reporting_errors(U,Stat,Term,UT),
    updt(S,UT,Stat).
updt([putt(Term)|S],U,Stat) :-
    unparser:unparse(Term,Stat,U,UT),
    updt(S,UT,Stat).
updt([puttq(Term)|S],U,Stat) :-
    unparser:unparse(Term,Stat,U,UT),
    updt(S,UT,Stat).
updt([putwt(Term)|S],U,Stat) :-
    unparser:unwparse(Term,Stat,U,UT),
    updt(S,UT,Stat).
updt([putwtq(Term)|S],U,Stat) :-
    unparser:unwparse(Term,Stat,U,UT),
    updt(S,UT,Stat).
updt([addop(Op,Type,Prec)|S],U,s(Ops,OnErr)) :-
    addop(Type,Op,Prec,Ops,NewOps),
    updt(S,U,s(NewOps,OnErr)).
updt([rmop(Op,Type)|S],U,s(Ops,OnErr)) :-
    rmop(Type,Op,Ops,NewOps),
    updt(S,U,s(NewOps,OnErr)).
updt([on_error(Pred)|S],U,s(Ops,_)) :-
    updt(S,U,s(Ops,Pred)).
otherwise.
updt([Msg|S],U,s(Ops,OnErr)) :-
    U=[Msg|UT],
    updt(S,UT,s(Ops,OnErr)).

addop(Kind,Op,Prec,ops(Prefix,Infix,Postfix),NOps) :-
	( Kind=fx; Kind=fy ) |
	addop2(Op,Kind,Prec,Prefix,NPrefix),
	NOps = ops(NPrefix,Infix,Postfix).
addop(Kind,Op,Prec,ops(Prefix,Infix,Postfix),NOps) :-
	( Kind=xfx; Kind=xfy; Kind=yfx ) |
	addop2(Op,Kind,Prec,Infix,NInfix),
	NOps = ops(Prefix,NInfix,Postfix).
addop(Kind,Op,Prec,ops(Prefix,Infix,Postfix),NOps) :-
	( Kind=xf; Kind=yf ) |
	addop2(Op,Kind,Prec,Postfix,NPostfix),
	NOps = ops(Prefix,Infix,NPostfix).

addop2(Op,Type,Prec,[op(Op,_Type,_)|Ops],NOps) :- NOps=[op(Op,Type,Prec)|Ops].
addop2(Op,Type,Prec,[],NOps):- NOps=[op(Op,Type,Prec)].
otherwise.
addop2(Op,Type,Prec,[Info|Ops],NOps) :-
	NOps=[Info|NOpsT],
	addop2(Op,Type,Prec,Ops,NOpsT).

rmop(Kind,Op,ops(Prefix,Infix,Postfix),NOps) :-
	( Kind=fx; Kind=fy ) |
	rmop2(Op,Kind,Prefix,NPrefix),
	NOps = ops(NPrefix,Infix,Postfix).
rmop(Kind,Op,ops(Prefix,Infix,Postfix),NOps) :-
	( Kind=xfx; Kind=xfy; Kind=yfx ) |
	rmop2(Op,Kind,Infix,NInfix),
	NOps = ops(Prefix,NInfix,Postfix).
rmop(Kind,Op,ops(Prefix,Infix,Postfix),NOps) :-
	( Kind=xf; Kind=yf ) |
	rmop2(Op,Kind,Postfix,NPostfix),
	NOps = ops(Prefix,Infix,NPostfix).

rmop2(Op,Type,[op(Op,_Type,_)|Ops],NOps) :- NOps=Ops.
rmop2(_Op,_Type,[],NOps):- NOps=[].
otherwise.
rmop2(Op,Type,[Info|Ops],NOps) :-
	NOps=[Info|NOpsT],
	rmop2(Op,Type,Ops,NOpsT).

default_operator_table(Ops) :-
    Ops=ops([op(#,fx,100), op(&,fx,200), op(+,fx,500), op(-,fx,500),
	     op((:-),fx,1200), op((?-),fx,1200), op((implicit),fx,1150),
	     op((local_implicit),fx,1150), op((mode),fx,1150),
	     op(module,fx,80), op(nospy,fy,900), op((public),fx,1150),
	     op(spy,fy,900), op((with_macro),fx,1150),
	     op(~,fy,300), op($~,fy,300),
	     op(\+,fy,900)],
	    [op(#,xfx,100), op($$:=,xfx,700),
	     op($$<,xfx,700), op($$<=,xfx,700), op($$=:=,xfx,700),
	     op($$=<,xfx,700), op($$=\=,xfx,700), op($$>,xfx,700),
	     op($$>=,xfx,700), op($:=,xfx,700), op($<,xfx,700),
	     op($<=,xfx,700), op($=:=,xfx,700), op($=<,xfx,700),
	     op($=\=,xfx,700), op($>,xfx,700), op($>=,xfx,700),
	     op(&<,xfx,700), op(&<=,xfx,700),
	     op(&=<,xfx,700), op(&>,xfx,700), op(&>=,xfx,700),
	     op($+=,xfx,700), op($-=,xfx,700),
	     op($*=,xfx,700), op($/=,xfx,700),
	     op(*,yfx,400), op(**,xfy,300), op(+,yfx,500),
	     op((','),xfy,1000), op(-,yfx,500),
	     op((-->),xfx,1200), op((->),xfy,1050),
	     op(/,yfx,400), op(//,yfx,400), op(/\,yfx,500),
	     op(:,xfy,800), op((:-),xfx,1200), op(::,xfx,90),
	     op(:=,xfx,700), op((;),xfy,1100), op(<,xfx,700),
	     op(<<,yfx,400), op(<<=,xfx,700),
	     op(<=,xfx,700), op(=>,xfx,700), op(<==,xfx,700),
	     op(=,xfx,700), op(=..,xfx,700), op(=:=,xfx,700),
	     op(=<,xfx,700), op(==,xfx,700), op((=>),xfx,1090),
	     op(=\=,xfx,700), op(>,xfx,700), op(>=,xfx,700),
	     op(+=,xfx,700), op(-=,xfx,700),
	     op(*=,xfx,700), op(/=,xfx,700),
	     op(>>,yfx,400), op(@,xfy,700),
	     op(@<,xfx,700), op(@=<,xfx,700), op(@>,xfx,700),
	     op(@>=,xfx,700), op(\/,yfx,500),
	     op(\=,xfx,700), op(\==,xfx,700), op(^,xfy,200),
	     op(is,xfx,700), op(mod,xfx,300), op(xor,yfx,500)],
	    [op(++,xf,150),op(--,xf,150)]).

output_stream(Stream,String) :-
    klicio:default_operator_table(Ops),
    klicio:out(Stream,Out,s(Ops,0)),
    string_output(Out,String,Chars,Chars).

string_output([],String,Chars,CharsT) :-
    CharsT=[],
    compute_string_length(Chars,0,L),
    generic:new(string,String0,L,8),
    fill_string(Chars,String0,String,0).
string_output([C|T],String,Chars,CharsT) :- integer(C) |
    CharsT=[C|CharsNT],
    string_output(T,String,Chars,CharsNT).
string_output([putc(C)|T],String,Chars,CharsT) :-
    CharsT=[C|CharsNT],
    string_output(T,String,Chars,CharsNT).
string_output([fwrite(S)|T],String,Chars,CharsT) :- string(S,L,_) |
    CharsT=[S|CharsNT],
    string_output(T,String,Chars,CharsNT).
string_output([fwrite(S,N)|T],String,Chars,CharsT) :- string(S,L,_) |
    N=L,
    CharsT=[S|CharsNT],
    string_output(T,String,Chars,CharsNT).

compute_string_length([],K,L) :- L=K.
compute_string_length([C|T],K,L) :- integer(C) |
    compute_string_length(T,~(K+1),L).
compute_string_length([S|T],K,L) :- string(S,SL,_) |
    compute_string_length(T,~(K+SL),L).

fill_string([],S0,S,_) :- S=S0.
fill_string([C|T],S0,S,K) :- integer(C) |
    set_string_element(S0,K,C,S1),
    fill_string(T,S1,S,~(K+1)).
fill_string([E|T],S0,S,K) :- string(E,EL,_) |
    set_string_elements(S0,K,0,EL,E,S1),
    fill_string(T,S1,S,~(K+EL)).

set_string_elements(S0,_K,EK,EL,_E,S) :- EK>=EL | S=S0.
set_string_elements(S0,K,EK,EL,E,S) :- EK<EL, string_element(E,EK,C) |
    set_string_element(S0,K,C,S1),
    set_string_elements(S1,~(K+1),~(EK+1),EL,E,S).

string_input([],_,_,_,_).
string_input([linecount(LC1)|T],String,K,L,LC) :-
    LC1=LC,
    string_input(T,String,K,L,LC).
string_input([getc(C)|T],String,K,L,LC) :- K >= L |
    C = -1,
    string_input(T,String,K,L,LC).
string_input([getc(C)|T],String,K,L,LC) :- K < L,
    string_element(String,K,C0), K1:=K+1 |
    C=C0,
    update_lc(C,LC,LC1),
    string_input(T,String,K1,L,LC).
string_input([ungetc(C)|T],String,K,L,LC) :- C=:= -1 |
    string_input(T,String,K,L,LC).
string_input([ungetc(C)|T],String,K,L,LC) :- C=\= -1, K > 0, K1:=K-1, C=\=10 |
    string_input(T,String,K1,L,LC).
string_input([ungetc(C)|T],String,K,L,LC) :- C=\= -1, K > 0, K1:=K-1, C=:=10 |
    LC1 := LC-1,
    string_input(T,String,K1,L,LC1).

update_lc(C,LC,LC1) :- C=:=10 | LC1:=LC+1.
update_lc(C,LC,LC1) :- C=\=10 | LC1=LC.