154 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Prolog
		
	
	
	
	
	
			
		
		
	
	
			154 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Prolog
		
	
	
	
	
	
| :- module(line_utils,
 | |
| 	  [search_for/2,
 | |
| 	   search_for/3,
 | |
| 	   scan_natural/3,
 | |
| 	   scan_integer/3,
 | |
| 	   split/2,
 | |
| 	   split/3,
 | |
| 	   fields/2,
 | |
| 	   fields/3,
 | |
| 	   glue/3,
 | |
| 	   copy_line/2,
 | |
| 	   filter/3,
 | |
| 	   file_filter/3,
 | |
| 	   file_filter_with_init/5,
 | |
| 	   process/2
 | |
| 	  ]).
 | |
| 
 | |
| :- meta_predicate
 | |
| 	filter(+,+,2),
 | |
| 	file_filter(+,+,2),
 | |
| 	file_filter_with_init(+,+,2,+,:),
 | |
| 	process(+,1).
 | |
| 
 | |
| :- use_module(library(lists),
 | |
| 	      [member/2,
 | |
| 	       append/3]).
 | |
| 
 | |
| :- use_module(library(readutil),
 | |
| 	      [read_line_to_codes/2]).
 | |
| 
 | |
| search_for(C,L) :-
 | |
| 	search_for(C, L, []).
 | |
| 
 | |
| search_for(C) --> [C], !.
 | |
| search_for(C) --> [_],
 | |
| 	search_for(C).
 | |
| 
 | |
| scan_integer(N) -->
 | |
| 	"-", !,
 | |
| 	scan_natural(0, N0),
 | |
| 	N is -N0.
 | |
| scan_integer(N) -->
 | |
| 	scan_natural(0, N).
 | |
| 
 | |
| scan_natural(N) -->
 | |
| 	scan_natural(0, N).
 | |
| 
 | |
| scan_natural(N0,N) -->
 | |
| 	[C],
 | |
| 	{C >= 0'0, C =< 0'9 }, !,
 | |
| 	{ N1 is N0*10+(C-0'0) }, %'
 | |
| 	get_natural(N1,N).
 | |
| scan_natural(N,N) --> [].
 | |
| 
 | |
| split(String, Strings) :-
 | |
| 	split_at_blank(" 	", Strings, String, []).
 | |
| 
 | |
| split(String, SplitCodes, Strings) :-
 | |
| 	split_at_blank(SplitCodes, Strings, String, []).
 | |
| 
 | |
| split_at_blank(SplitCodes, More) -->
 | |
| 	[C],
 | |
| 	{ member(C, SplitCodes) }, !,
 | |
| 	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).
 | |
| split(SplitCodes, [C|New], Set) -->
 | |
| 	[C], !,
 | |
| 	split(SplitCodes, New, Set).
 | |
| split(_, [], []) --> [].
 | |
| 
 | |
| 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(_, [], []) --> [].
 | |
| 
 | |
| glue([], _, []).
 | |
| glue([A], _, A) :- !.
 | |
| 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
 | |
| 	->
 | |
| 	 !
 | |
| 	;
 | |
| 	 call(Command, Line, NewLine),
 | |
| 	 format(StreamOut, '~s~n', [NewLine]),
 | |
| 	 fail
 | |
| 	).
 | |
| 
 | |
| 
 | |
| process(StreamInp, Command) :-
 | |
| 	repeat,
 | |
| 	read_line_to_codes(StreamInp, Line),
 | |
| 	(
 | |
| 	 Line == end_of_file
 | |
| 	->
 | |
| 	 !
 | |
| 	;
 | |
| 	 call(Command, Line),
 | |
| 	 fail
 | |
| 	).
 | |
| 
 | |
| 
 | |
| file_filter(Inp, Out, Command) :-
 | |
| 	open(Inp, read, StreamInp),
 | |
| 	open(Out, write, StreamOut),
 | |
| 	filter(StreamInp, StreamOut, Command),
 | |
| 	close(StreamInp),
 | |
| 	close(StreamOut).
 | |
| 
 | |
| 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).
 | |
| 
 | |
| 
 |