View | Details | Raw Unified | Return to bug 24732 | Differences between
and this patch

Collapse All | Expand All

(-)cmp/extern.h (-4 / +6 lines)
Lines 40-48 Link Here
40
#define DIFF_EXIT	1
40
#define DIFF_EXIT	1
41
#define ERR_EXIT	2	/* error exit code */
41
#define ERR_EXIT	2	/* error exit code */
42
42
43
void	c_regular __P((int, char *, off_t, off_t, int, char *, off_t, off_t));
43
void		c_regular __P((int, char *, off_t, off_t, int, char *, off_t,
44
void	c_special __P((int, char *, off_t, int, char *, off_t));
44
			       off_t));
45
void	diffmsg __P((char *, char *, off_t, off_t));
45
void		c_special __P((int, char *, off_t, int, char *, off_t));
46
void	eofmsg __P((char *));
46
void		diffmsg __P((char *, char *, off_t, off_t));
47
void		eofmsg __P((char *));
48
u_char *	remmap __P((u_char *, int, off_t));
47
49
48
extern int lflag, sflag, xflag;
50
extern int lflag, sflag, xflag;
(-)cmp/regular.c (-18 / +48 lines)
Lines 52-57 Link Here
52
#include "extern.h"
52
#include "extern.h"
53
53
54
#define ROUNDPAGE(i) ((i) & ~pagemask)
54
#define ROUNDPAGE(i) ((i) & ~pagemask)
55
#define	MMAP_CHUNK	(8*1024*1024)
55
56
56
void
57
void
57
c_regular(fd1, file1, skip1, len1, fd2, file2, skip2, len2)
58
c_regular(fd1, file1, skip1, len1, fd2, file2, skip2, len2)
Lines 59-68 Link Here
59
	char *file1, *file2;
60
	char *file1, *file2;
60
	off_t skip1, len1, skip2, len2;
61
	off_t skip1, len1, skip2, len2;
61
{
62
{
62
	u_char ch, *p1, *p2;
63
	u_char ch, *p1, *p2, *m1, *m2;
63
	off_t byte, length, line;
64
	off_t byte, length, line;
64
	int dfound;
65
	int dfound;
65
	off_t pagemask, off1, off2;
66
	off_t pagemask, off1, off2, st1, st2;
66
	size_t pagesize;
67
	size_t pagesize;
67
68
68
	if (skip1 > len1)
69
	if (skip1 > len1)
Lines 81-107 Link Here
81
	off2 = ROUNDPAGE(skip2);
82
	off2 = ROUNDPAGE(skip2);
82
83
83
	length = MIN(len1, len2);
84
	length = MIN(len1, len2);
84
	if (length > SIZE_T_MAX)
85
	dfound = 0;
85
		return (c_special(fd1, file1, skip1, fd2, file2, skip2));
86
	st1 = skip1 - off1;
87
	st2 = skip2 - off2;
86
88
87
	if ((p1 = (u_char *)mmap(NULL, (size_t)len1 + skip1 % pagesize,
89
	m1 = remmap(NULL, fd1, off1);
88
	    PROT_READ, MAP_SHARED, fd1, off1)) == (u_char *)MAP_FAILED)
90
	m2 = remmap(NULL, fd2, off2);
89
		err(ERR_EXIT, "%s", file1);
91
	if (!m1 || !m2)
90
92
		c_special(fd1, file1, skip1, fd2, file2, skip2);
91
	madvise(p1, len1 + skip1 % pagesize, MADV_SEQUENTIAL);
93
		/* NOTREACHED */
92
	if ((p2 = (u_char *)mmap(NULL, (size_t)len2 + skip2 % pagesize,
93
	    PROT_READ, MAP_SHARED, fd2, off2)) == (u_char *)MAP_FAILED)
94
		err(ERR_EXIT, "%s", file2);
95
	madvise(p2, len2 + skip2 % pagesize, MADV_SEQUENTIAL);
96
94
97
	dfound = 0;
95
	p1 = m1 + st1;
98
	p1 += skip1 - off1;
96
	p2 = m2 + st2;
99
	p2 += skip2 - off2;
97
100
	for (byte = line = 1; length--; ++p1, ++p2, ++byte) {
98
	for (byte = line = 1; length--; ++byte) {
101
		if ((ch = *p1) != *p2) {
99
		if ((ch = *p1) != *p2) {
102
			if (xflag) {
100
			if (xflag) {
103
				dfound = 1;
101
				dfound = 1;
104
				(void)printf("%08qx %02x %02x\n", byte - 1, ch, *p2);
102
				(void)printf("%08qx %02x %02x\n", byte - 1,
103
					     ch, *p2);
105
			} else if (lflag) {
104
			} else if (lflag) {
106
				dfound = 1;
105
				dfound = 1;
107
				(void)printf("%6qd %3o %3o\n", byte, ch, *p2);
106
				(void)printf("%6qd %3o %3o\n", byte, ch, *p2);
Lines 111-120 Link Here
111
		}
110
		}
112
		if (ch == '\n')
111
		if (ch == '\n')
113
			++line;
112
			++line;
113
		if (++st1 == MMAP_CHUNK) {
114
			st1 = 0;
115
			off1 += MMAP_CHUNK;
116
			p1 = m1 = remmap(m1, fd1, off1);
117
		} else
118
			++p1;
119
		if (++st2 == MMAP_CHUNK) {
120
			st2 = 0;
121
			off2 += MMAP_CHUNK;
122
			p2 = m2 = remmap(m2, fd2, off2);
123
		} else
124
			++p2;
125
		if (!m1 || !m2)
126
			c_special(fd1, file1, skip1, fd2, file2, skip2);
127
			/* NOTREACHED */
114
	}
128
	}
115
129
116
	if (len1 != len2)
130
	if (len1 != len2)
117
		eofmsg (len1 > len2 ? file2 : file1);
131
		eofmsg (len1 > len2 ? file2 : file1);
118
	if (dfound)
132
	if (dfound)
119
		exit(DIFF_EXIT);
133
		exit(DIFF_EXIT);
134
}
135
136
u_char *
137
remmap(mem, fd, offset)
138
	u_char	*mem;
139
	int	fd;
140
	off_t	offset;
141
{
142
	if (mem)
143
		munmap(mem, MMAP_CHUNK);
144
	mem = (u_char *)mmap(NULL, MMAP_CHUNK, PROT_READ, MAP_SHARED, fd,
145
			     offset);
146
	if (mem == (u_char *)MAP_FAILED)
147
		return (NULL);
148
	madvise(mem, MMAP_CHUNK, MADV_SEQUENTIAL);
149
	return (mem);
120
}
150
}

Return to bug 24732