File: filter.m

package info (click to toggle)
mercury 0.9-1
  • links: PTS
  • area: main
  • in suites: potato
  • size: 18,488 kB
  • ctags: 9,800
  • sloc: objc: 146,680; ansic: 51,418; sh: 6,436; lisp: 1,567; cpp: 1,040; perl: 854; makefile: 450; asm: 232; awk: 203; exp: 32; fortran: 3; csh: 1
file content (101 lines) | stat: -rw-r--r-- 3,079 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
%-----------------------------------------------------------------------------%
% Copyright (C) 1998 The University of Melbourne.
% This file may only be copied under the terms of the GNU General
% Public License - see the file COPYING in the Mercury distribution.
%-----------------------------------------------------------------------------%

% Main author: bromage

% This module contains code to filter the diff before output, based on
% the command-line options presented.

% At the moment, only one option is handled: --ignore-blank-lines.
% This causes edits to be dropped if they contain changes which only
% add, delete or change blank lines.

% TO DO: What exactly is a blank line, and does its definition change
%        if --ignore-space-change or --ignore-all-space have been
%        specified?  At the moment, we define a blank line to be a line
%        containing zero or more whitespace characters.  Check if this is
%        correct or not.

%-----------------------------------------------------------------------------%

:- module filter.

:- interface.
:- import_module difftype, file, io.

:- pred filter_diff(diff :: in, file :: in, file :: in, diff :: out,
		io__state :: di, io__state :: uo) is det.

%-----------------------------------------------------------------------------%
%-----------------------------------------------------------------------------%

:- implementation.
:- import_module globals, options.
:- import_module bool, list, int, std_util, string, char.

filter_diff(Diff0, File1, File2, Diff) -->
	globals__io_lookup_bool_option(ignore_blank_lines, FilterBlank),

	{ FilterBlank = no ->
		% If we didn't request a filter, skip this pass.

		Diff = Diff0
	;
		filter__blank_lines(Diff0, File1, File2, Diff)
	}.

:- pred filter__blank_lines(diff :: in, file :: in, file :: in, diff :: out)
		is det.

filter__blank_lines([], _, _, []).
filter__blank_lines([Edit | Diff0], File1, File2, Diff) :-
	filter__blank_lines(Diff0, File1, File2, Diff1),
	( Edit = add(_, Y1 - Y2),
		( range_has_only_blank_lines(Y1, Y2, File2) ->
			Diff = Diff1
		;
			Diff = [Edit | Diff1]
		)
	; Edit = delete(X1 - X2, _),
		( range_has_only_blank_lines(X1, X2, File1) ->
			Diff = Diff1
		;
			Diff = [Edit | Diff1]
		)
	; Edit = change(X1 - X2, Y1 - Y2),
		(
			range_has_only_blank_lines(X1, X2, File1),
			range_has_only_blank_lines(Y1, Y2, File2)
		->
			Diff = Diff1
		;
			Diff = [Edit | Diff1]
		)
	).

%-----------------------------------------------------------------------------%

:- pred range_has_only_blank_lines(int, int, file).
:- mode range_has_only_blank_lines(in, in, in) is semidet.

range_has_only_blank_lines(First, Last, File) :-
	(
		First < Last
	=>
		(
			file__get_line(File, First, Line),
			string__to_char_list(Line, Chars),
			all [C] (
				list__member(C, Chars)
			=>
				char__is_whitespace(C)
			),
			range_has_only_blank_lines(First + 1, Last, File)
		)
	).

%-----------------------------------------------------------------------------%
%-----------------------------------------------------------------------------%