2008-01-14 16:34:06 +00:00
|
|
|
:- module(line_utils,
|
2008-09-01 04:44:54 +01:00
|
|
|
[search_for/2,
|
|
|
|
search_for/3,
|
2008-01-14 16:34:06 +00:00
|
|
|
scan_natural/3,
|
2008-01-23 22:22:42 +00:00
|
|
|
scan_integer/3,
|
2008-12-17 14:46:39 +00:00
|
|
|
split/2,
|
2008-02-25 10:15:31 +00:00
|
|
|
split/3,
|
2009-07-15 23:30:27 +01:00
|
|
|
fields/2,
|
|
|
|
fields/3,
|
2008-02-25 10:15:31 +00:00
|
|
|
glue/3,
|
2008-09-01 04:44:54 +01:00
|
|
|
copy_line/2,
|
2008-02-25 10:15:31 +00:00
|
|
|
filter/3,
|
2008-02-28 00:33:52 +00:00
|
|
|
file_filter/3,
|
2010-04-18 21:48:00 +01:00
|
|
|
file_filter_with_init/5,
|
2008-09-04 16:58:45 +01:00
|
|
|
process/2
|
2008-01-14 16:34:06 +00:00
|
|
|
]).
|
|
|
|
|
2010-04-18 21:48:00 +01:00
|
|
|
:- meta_predicate filter(+,+,:), file_filter(+,+,:), file_filter_with_init(+,+,:,+,:), process(+,:).
|
2008-02-25 10:15:31 +00:00
|
|
|
|
2008-01-14 16:34:06 +00:00
|
|
|
:- use_module(library(lists),
|
2008-02-25 10:15:31 +00:00
|
|
|
[member/2,
|
|
|
|
append/3]).
|
|
|
|
|
|
|
|
:- use_module(library(readutil),
|
|
|
|
[read_line_to_codes/2]).
|
2008-01-14 16:34:06 +00:00
|
|
|
|
2008-09-01 04:44:54 +01:00
|
|
|
search_for(C,L) :-
|
|
|
|
search_for(C, L, []).
|
2008-01-14 16:34:06 +00:00
|
|
|
|
|
|
|
search_for(C) --> [C], !.
|
|
|
|
search_for(C) --> [_],
|
|
|
|
search_for(C).
|
|
|
|
|
2008-01-23 22:22:42 +00:00
|
|
|
scan_integer(N) -->
|
|
|
|
"-", !,
|
|
|
|
scan_natural(0, N0),
|
|
|
|
N is -N0.
|
|
|
|
scan_integer(N) -->
|
2008-01-14 16:34:06 +00:00
|
|
|
scan_natural(0, N).
|
|
|
|
|
2008-09-01 04:44:54 +01:00
|
|
|
scan_natural(N) -->
|
|
|
|
scan_natural(0, N).
|
|
|
|
|
2008-01-14 16:34:06 +00:00
|
|
|
scan_natural(N0,N) -->
|
|
|
|
[C],
|
|
|
|
{C >= 0'0, C =< 0'9 }, !,
|
2008-09-01 04:44:54 +01:00
|
|
|
{ N1 is N0*10+(C-0'0) }, %'
|
2008-01-14 16:34:06 +00:00
|
|
|
get_natural(N1,N).
|
|
|
|
scan_natural(N,N) --> [].
|
|
|
|
|
2008-12-17 14:46:39 +00:00
|
|
|
split(String, Strings) :-
|
|
|
|
split_at_blank(" ", Strings, String, []).
|
|
|
|
|
2008-02-25 10:15:31 +00:00
|
|
|
split(String, SplitCodes, Strings) :-
|
|
|
|
split_at_blank(SplitCodes, Strings, String, []).
|
2008-01-14 16:34:06 +00:00
|
|
|
|
2008-02-25 10:15:31 +00:00
|
|
|
split_at_blank(SplitCodes, More) -->
|
2008-01-14 16:34:06 +00:00
|
|
|
[C],
|
|
|
|
{ member(C, SplitCodes) }, !,
|
2008-02-25 10:15:31 +00:00
|
|
|
split_at_blank(SplitCodes, More).
|
|
|
|
split_at_blank(SplitCodes, [[C|New]| More]) -->
|
|
|
|
[C], !,
|
|
|
|
split(SplitCodes, New, More).
|
|
|
|
split_at_blank(_, []) --> [].
|
|
|
|
|
|
|
|
split(SplitCodes, [], More) -->
|
|
|
|
[C],
|
|
|
|
{ member(C, SplitCodes) }, !,
|
|
|
|
split_at_blank(SplitCodes, More).
|
2008-01-14 16:34:06 +00:00
|
|
|
split(SplitCodes, [C|New], Set) -->
|
|
|
|
[C], !,
|
|
|
|
split(SplitCodes, New, Set).
|
|
|
|
split(_, [], []) --> [].
|
|
|
|
|
2009-07-15 23:30:27 +01:00
|
|
|
fields(String, Strings) :-
|
|
|
|
fields(" ", Strings, String, []).
|
|
|
|
|
|
|
|
fields(String, FieldsCodes, Strings) :-
|
|
|
|
dofields(FieldsCodes, First, More, String, []),
|
|
|
|
(
|
|
|
|
First = [], More = []
|
|
|
|
->
|
|
|
|
Strings = []
|
|
|
|
;
|
|
|
|
Strings = [First|More]
|
|
|
|
).
|
|
|
|
|
|
|
|
dofields(FieldsCodes, [], New.More) -->
|
|
|
|
[C],
|
|
|
|
{ member(C, FieldsCodes) }, !,
|
|
|
|
dofields(FieldsCodes, New, More).
|
|
|
|
dofields(FieldsCodes, [C|New], Set) -->
|
|
|
|
[C], !,
|
|
|
|
dofields(FieldsCodes, New, Set).
|
|
|
|
dofields(_, [], []) --> [].
|
|
|
|
|
2008-02-25 10:15:31 +00:00
|
|
|
glue([], _, []).
|
2008-04-14 18:30:18 +01:00
|
|
|
glue([A], _, A) :- !.
|
2008-02-25 10:15:31 +00:00
|
|
|
glue([H|T], [B|_], Merged) :-
|
|
|
|
append(H, [B|Rest], Merged),
|
|
|
|
glue(T, [B], Rest).
|
|
|
|
|
|
|
|
copy_line(StreamInp, StreamOut) :-
|
|
|
|
read_line_to_codes(StreamInp, Line),
|
|
|
|
format(StreamOut, '~s~n', [Line]).
|
|
|
|
|
|
|
|
filter(StreamInp, StreamOut, Command) :-
|
|
|
|
repeat,
|
|
|
|
read_line_to_codes(StreamInp, Line),
|
|
|
|
(
|
|
|
|
Line == end_of_file
|
|
|
|
->
|
2009-08-20 02:23:20 +01:00
|
|
|
!
|
2008-02-25 10:15:31 +00:00
|
|
|
;
|
|
|
|
call(Command, Line, NewLine),
|
|
|
|
format(StreamOut, '~s~n', [NewLine]),
|
|
|
|
fail
|
|
|
|
).
|
|
|
|
|
|
|
|
|
2008-02-28 00:33:52 +00:00
|
|
|
process(StreamInp, Command) :-
|
|
|
|
repeat,
|
|
|
|
read_line_to_codes(StreamInp, Line),
|
|
|
|
(
|
|
|
|
Line == end_of_file
|
|
|
|
->
|
2009-08-20 02:23:20 +01:00
|
|
|
!
|
2008-02-28 00:33:52 +00:00
|
|
|
;
|
|
|
|
call(Command, Line),
|
|
|
|
fail
|
|
|
|
).
|
|
|
|
|
|
|
|
|
2008-02-25 10:15:31 +00:00
|
|
|
file_filter(Inp, Out, Command) :-
|
|
|
|
open(Inp, read, StreamInp),
|
|
|
|
open(Out, write, StreamOut),
|
|
|
|
filter(StreamInp, StreamOut, Command),
|
|
|
|
close(StreamInp),
|
|
|
|
close(StreamOut).
|
|
|
|
|
2010-04-18 21:48:00 +01:00
|
|
|
file_filter_with_init(Inp, Out, Command, FormatString, Parameters) :-
|
|
|
|
open(Inp, read, StreamInp),
|
|
|
|
open(Out, write, StreamOut),
|
|
|
|
format(StreamOut, FormatString, Parameters),
|
|
|
|
filter(StreamInp, StreamOut, Command),
|
|
|
|
close(StreamInp),
|
|
|
|
close(StreamOut).
|
|
|
|
|
2008-02-25 10:15:31 +00:00
|
|
|
|