diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2013-11-27 21:05:51 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2013-11-27 21:05:51 -0800 |
commit | 5285db54f7199cf75c0b740faaeee15cc9cc8c6a (patch) | |
tree | 98afe773267c450f14759e02724a0fa9c2b89c7d /match.c | |
parent | 6fedaccfe790e33bb7a71d8a5f776e4cfa7e6c62 (diff) | |
download | txr-5285db54f7199cf75c0b740faaeee15cc9cc8c6a.tar.gz txr-5285db54f7199cf75c0b740faaeee15cc9cc8c6a.tar.bz2 txr-5285db54f7199cf75c0b740faaeee15cc9cc8c6a.zip |
* configure: Added check to detect POSIX sleep function.
* eval.c (eval_init): Register new open_tail function as intrinsic.
* match.c (complex_snarf, complex_stream): Update calls to
make_stdio_stream and make_pipe_stream to take fewer arguments.
(match_files): Support a stream object as a data source specification
in place of a string.
* parser.l (parse_reset): Update call to make_stdio_stream to take
fewer arguments.
* stream.c: Inclusion of <unistd.h> made properly conditional.
(struct stdio_handle): pid member defined as pid_t only if we have fork
functionality, otherwise defined as int.
(tail_get_line, tail_get_char, tail_get_byte): New static functions.
(tail_ops): New static structure.
(make_stdio_stream_common): New static structure.
(make_stdio_stream, make_pipe_stream): These functions lose the input
and output parameters, which ended up never used. Reimplemented
in terms of new common function.
(make_tail_stream): New function.
(make_pipevp_stream): Reimplemented in terms of new common function.
(open_file, open_command): Simplified by removal of useless local
variables and their computation, which used to be extra arguments to
make_stdio_stream and make_pipe_stream.
(open_tail): New function.
(stream_init): Calls to make_stdio_stream updated.
* stream.h (make_stdio_stream, make_pipe_stream): Declarations updated.
(make_tail_stream, open_tail): Declared.
* txr.c (txr_main): Calls to make_stdio_stream updated.
Diffstat (limited to 'match.c')
-rw-r--r-- | match.c | 60 |
1 files changed, 34 insertions, 26 deletions
@@ -1521,9 +1521,9 @@ static val complex_snarf(fpip_t fp, val name) { switch (fp.close) { case fpip_fclose: - return lazy_stream_cons(make_stdio_stream(fp.f, name, t, nil)); + return lazy_stream_cons(make_stdio_stream(fp.f, name)); case fpip_pclose: - return lazy_stream_cons(make_pipe_stream(fp.f, name, t, nil)); + return lazy_stream_cons(make_pipe_stream(fp.f, name)); case fpip_closedir: return lazy_stream_cons(make_dir_stream(fp.d)); } @@ -1535,9 +1535,9 @@ static val complex_stream(fpip_t fp, val name) { switch (fp.close) { case fpip_fclose: - return make_stdio_stream(fp.f, name, t, nil); + return make_stdio_stream(fp.f, name); case fpip_pclose: - return make_pipe_stream(fp.f, name, t, nil); + return make_pipe_stream(fp.f, name); case fpip_closedir: uw_throwf(query_error_s, lit("cannot output to directory: ~a"), name, nao); } @@ -3650,37 +3650,45 @@ static val match_files(match_files_ctx c) gc_hint(c.data); if (listp(c.data)) { /* recursive call with lazy list */ - ; /* no specia initialization */ + ; /* no special initialization */ } else if (c.files) { /* c.data == t: toplevel call with file list */ val source_spec = first(c.files); val name = consp(source_spec) ? cdr(source_spec) : source_spec; - fpip_t fp = (errno = 0, complex_open(name, nil, nil)); - spec_bind (specline, first_spec, c.spec); - if (consp(first_spec) && eq(first(first_spec), next_s) && !rest(specline)) { - debuglf(first_spec, lit("not opening source ~a " - "since query starts with next directive"), name, nao); - } else { - val spec = first(c.spec); - debuglf(spec, lit("opening data source ~a"), name, nao); + if (stringp(name)) { + fpip_t fp = (errno = 0, complex_open(name, nil, nil)); + spec_bind (specline, first_spec, c.spec); + + if (consp(first_spec) && eq(first(first_spec), next_s) && !rest(specline)) { + debuglf(first_spec, lit("not opening source ~a " + "since query starts with next directive"), name, nao); + } else { + val spec = first(c.spec); + debuglf(spec, lit("opening data source ~a"), name, nao); - if (complex_open_failed(fp)) { - if (consp(source_spec) && car(source_spec) == nothrow_k) { - debuglf(spec, lit("could not open ~a: " - "treating as failed match due to nothrow"), name, nao); + if (complex_open_failed(fp)) { + if (consp(source_spec) && car(source_spec) == nothrow_k) { + debuglf(spec, lit("could not open ~a: " + "treating as failed match due to nothrow"), name, nao); + debug_return (nil); + } else if (errno != 0) + file_err(spec, lit("could not open ~a (error ~a/~a)"), name, + num(errno), string_utf8(strerror(errno)), nao); + else + file_err(spec, lit("could not open ~a"), name, nao); debug_return (nil); - } else if (errno != 0) - file_err(spec, lit("could not open ~a (error ~a/~a)"), name, - num(errno), string_utf8(strerror(errno)), nao); - else - file_err(spec, lit("could not open ~a"), name, nao); - debug_return (nil); - } + } - c.files = cons(name, cdr(c.files)); /* Get rid of cons and nothrow */ + c.files = cons(name, cdr(c.files)); /* Get rid of cons and nothrow */ - if ((c.data = complex_snarf(fp, name)) != nil) + if ((c.data = complex_snarf(fp, name)) != nil) + c.data_lineno = num(1); + } + } else if (streamp(name)) { + if ((c.data = lazy_stream_cons(name))) c.data_lineno = num(1); + } else { + c.data = nil; } } else { /* toplevel call with no data or file list */ c.data = nil; |