FITNBSMMJCQIFJGUMVSZYHJM4OSBXEZO5YWYEJ4CXGMFPBSIT5WAC
PXI442CY2KQHHAIJ3UNCWKTAI4IFYNGYEBRQMDR6T53YZTY2VMMQC
UW27LKXM2BJ77FQLTY4WPKDSSWI2RFNFRJ7CB4U3TS7KYVIV72LQC
VEMUXGMKKVS2DJSA2ICYDEWLC7SII4XEWVCSD676CHLSNQLUOZ5AC
VSQGRPJ7PDH3MOC7GFVX5YONUZTLFRXU2O6CFT5MRGBGOO7PO6GAC
JDZASPALXSFZOL3MXCKBPX74CUD3W743ZJ6W2422FIJ7NJOD67ZAC
5XO7IKBGCVXGVWMDJDE5MELS4FWRITKAU6NNV36NQ4TOZRR7UQ7QC
A2JAXDJWT2FAKADYOY6QOQ7LQRMTTCDIOYT7STSESVHLZQEQJBMAC
f=$(mktemp)
lisp_eval_should_be "(progn (with-output-to \">\" \"${f}\" (print \"foo\") (print 3) (fflush)) (close \"${f}\"))" '()' 'with-output-to print close'
lisp_eval_should_be "(with-input-from \"<\" \"${f}\" (print (getline)) (print (getline)))" '(""foo"" 1)
("3" 1)
()' 'with-input-from getline'
print _repr(x)
if(_OUTPUT_REDIR_NAME) {
if(_OUTPUT_REDIR_KIND == ">") {
print _repr(x) > _OUTPUT_REDIR_NAME
_OUTPUT_REDIR_KIND = ">>"
} else if(_OUTPUT_REDIR_KIND == ">>") {
print _repr(x) >> _OUTPUT_REDIR_NAME
} else if(_OUTPUT_REDIR_KIND == "|") {
print _repr(x) | _OUTPUT_REDIR_NAME
}
} else {
print _repr(x)
}
else if(car == _symbol("with-input-from"))
return _with_input_from(_eval3(_cadr(form), env, env, d+1),
_eval3(_caddr(form), env, env, d+1),
_cdddr(form), env, d+1) # to be evprogged
else if(car == _symbol("fflush"))
return _fflush()
else if(car == _symbol("close"))
return _close(_eval3(_cadr(form), env, env, d+1))
return _nil()
}
}
function _with_rs(new_rs, forms, env, d, old_rs, rv) {
old_rs = RS
if(_TYPE[new_rs] == "s") {
RS = _STRING[new_rs]
rv = _evprog(forms, env, env, d)
RS = old_rs
return rv
} else {
logg_err("_with_rs", "with-rs needs a string")
return _nil()
}
}
function _with_fs(new_fs, forms, env, d, old_fs, rv) {
old_fs = FS
if(_TYPE[new_fs] == "s") {
FS = _STRING[new_fs]
rv = _evprog(forms, env, env, d)
FS = old_fs
return rv
} else {
logg_err("_with_fs", "with-fs needs a string")
return _nil()
}
}
# same as above. every function that consumes input, check these
# globals. they are only set within the body of with-output-to. note:
# (with-input-from "|" "echo foo" (getline)) in glotawk corresponds
# with "echo foo" | getline in awk.
function _with_input_from(redir_kind, name, forms, env, d, old_redir_kind, old_name, rv) {
old_redir_kind = _INPUT_REDIR_KIND
old_name = _INPUT_NAME
if(_TYPE[redir_kind] == "s") {
if(_TYPE[name] == "s") {
_INPUT_REDIR_KIND = _STRING[redir_kind]
_INPUT_REDIR_NAME = _STRING[name]
rv = _evprog(forms, env, env, d)
_INPUT_REDIR_KIND = old_redir_kind
_INPUT_REDIR_NAME = old_name
return rv
} else {
logg_err("_with_input_from", "file or command should be a string")
return _nil()
}
} else {
logg_err("_with_input_from", "redir kind should be a string: \"<\" or \"|\"")