Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
liblongpath-rsync
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
liblongpath
liblongpath-rsync
Commits
1e4f48d6
Commit
1e4f48d6
authored
Aug 22, 2003
by
Wayne Davison
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Whitespace tweaks.
parent
fb55e28d
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
58 additions
and
59 deletions
+58
-59
match.c
match.c
+58
-59
No files found.
match.c
View file @
1e4f48d6
/*
/*
Copyright (C) Andrew Tridgell 1996
Copyright (C) Paul Mackerras 1996
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
...
...
@@ -40,8 +40,8 @@ static int total_matches;
extern
struct
stats
stats
;
struct
target
{
tag
t
;
int
i
;
tag
t
;
int
i
;
};
static
struct
target
*
targets
;
...
...
@@ -53,34 +53,33 @@ static int *tag_table;
static
int
compare_targets
(
struct
target
*
t1
,
struct
target
*
t2
)
{
return
((
int
)
t1
->
t
-
(
int
)
t2
->
t
)
;
return
(
int
)
t1
->
t
-
(
int
)
t2
->
t
;
}
static
void
build_hash_table
(
struct
sum_struct
*
s
)
{
int
i
;
int
i
;
if
(
!
tag_table
)
tag_table
=
(
int
*
)
malloc
(
sizeof
(
tag_table
[
0
])
*
TABLESIZE
);
if
(
!
tag_table
)
tag_table
=
(
int
*
)
malloc
(
sizeof
(
tag_table
[
0
])
*
TABLESIZE
);
targets
=
(
struct
target
*
)
malloc
(
sizeof
(
targets
[
0
])
*
s
->
count
);
if
(
!
tag_table
||
!
targets
)
out_of_memory
(
"build_hash_table"
);
targets
=
(
struct
target
*
)
malloc
(
sizeof
(
targets
[
0
])
*
s
->
count
);
if
(
!
tag_table
||
!
targets
)
out_of_memory
(
"build_hash_table"
);
for
(
i
=
0
;
i
<
(
int
)
s
->
count
;
i
++
)
{
targets
[
i
].
i
=
i
;
targets
[
i
].
t
=
gettag
(
s
->
sums
[
i
].
sum1
);
}
for
(
i
=
0
;
i
<
(
int
)
s
->
count
;
i
++
)
{
targets
[
i
].
i
=
i
;
targets
[
i
].
t
=
gettag
(
s
->
sums
[
i
].
sum1
);
}
qsort
(
targets
,
s
->
count
,
sizeof
(
targets
[
0
]),(
int
(
*
)())
compare_targets
);
qsort
(
targets
,
s
->
count
,
sizeof
(
targets
[
0
]),(
int
(
*
)())
compare_targets
);
for
(
i
=
0
;
i
<
TABLESIZE
;
i
++
)
tag_table
[
i
]
=
NULL_TAG
;
for
(
i
=
0
;
i
<
TABLESIZE
;
i
++
)
tag_table
[
i
]
=
NULL_TAG
;
for
(
i
=
s
->
count
-
1
;
i
>=
0
;
i
--
)
{
tag_table
[
targets
[
i
].
t
]
=
i
;
}
for
(
i
=
s
->
count
-
1
;
i
>=
0
;
i
--
)
tag_table
[
targets
[
i
].
t
]
=
i
;
}
...
...
@@ -116,8 +115,8 @@ static void matched(int f,struct sum_struct *s,struct map_struct *buf,
stats
.
matched_data
+=
s
->
sums
[
i
].
len
;
n
+=
s
->
sums
[
i
].
len
;
}
for
(
j
=
0
;
j
<
n
;
j
+=
CHUNK_SIZE
)
{
for
(
j
=
0
;
j
<
n
;
j
+=
CHUNK_SIZE
)
{
int
n1
=
MIN
(
CHUNK_SIZE
,
n
-
j
);
sum_update
(
map_ptr
(
buf
,
last_match
+
j
,
n1
),
n1
);
}
...
...
@@ -142,7 +141,7 @@ static void hash_search(int f,struct sum_struct *s,
OFF_T
offset
,
end
;
int
j
,
k
,
last_i
;
char
sum2
[
SUM_LENGTH
];
uint32
s1
,
s2
,
sum
;
uint32
s1
,
s2
,
sum
;
schar
*
map
;
/* last_i is used to encourage adjacent matches, allowing the RLL coding of the
...
...
@@ -156,31 +155,31 @@ static void hash_search(int f,struct sum_struct *s,
/* cast is to make s->blength signed; it should always be reasonably
* small */
k
=
MIN
(
len
,
(
OFF_T
)
s
->
blength
);
map
=
(
schar
*
)
map_ptr
(
buf
,
0
,
k
);
sum
=
get_checksum1
((
char
*
)
map
,
k
);
s1
=
sum
&
0xFFFF
;
s2
=
sum
>>
16
;
if
(
verbose
>
3
)
rprintf
(
FINFO
,
"sum=%.8x k=%d
\n
"
,
sum
,
k
);
offset
=
0
;
end
=
len
+
1
-
s
->
sums
[
s
->
count
-
1
].
len
;
if
(
verbose
>
3
)
rprintf
(
FINFO
,
"hash search s->blength=%ld len=%.0f count=%ld
\n
"
,
(
long
)
s
->
blength
,
(
double
)
len
,
(
long
)
s
->
count
);
do
{
tag
t
=
gettag2
(
s1
,
s2
);
int
done_csum2
=
0
;
j
=
tag_table
[
t
];
if
(
verbose
>
4
)
rprintf
(
FINFO
,
"offset=%.0f sum=%08x
\n
"
,(
double
)
offset
,
sum
);
if
(
j
==
NULL_TAG
)
{
goto
null_tag
;
}
...
...
@@ -189,44 +188,44 @@ static void hash_search(int f,struct sum_struct *s,
tag_hits
++
;
for
(;
j
<
(
int
)
s
->
count
&&
targets
[
j
].
t
==
t
;
j
++
)
{
int
l
,
i
=
targets
[
j
].
i
;
if
(
sum
!=
s
->
sums
[
i
].
sum1
)
continue
;
/* also make sure the two blocks are the same length */
l
=
MIN
(
s
->
blength
,
len
-
offset
);
if
(
l
!=
s
->
sums
[
i
].
len
)
continue
;
if
(
l
!=
s
->
sums
[
i
].
len
)
continue
;
if
(
verbose
>
3
)
rprintf
(
FINFO
,
"potential match at %.0f target=%d %d sum=%08x
\n
"
,
(
double
)
offset
,
j
,
i
,
sum
);
if
(
!
done_csum2
)
{
map
=
(
schar
*
)
map_ptr
(
buf
,
offset
,
l
);
get_checksum2
((
char
*
)
map
,
l
,
sum2
);
done_csum2
=
1
;
}
if
(
memcmp
(
sum2
,
s
->
sums
[
i
].
sum2
,
s
->
s2length
)
!=
0
)
{
false_alarms
++
;
continue
;
}
/* we've found a match, but now check to see
if last_i can hint at a better match */
*
if last_i can hint at a better match */
for
(
j
++
;
j
<
(
int
)
s
->
count
&&
targets
[
j
].
t
==
t
;
j
++
)
{
int
i2
=
targets
[
j
].
i
;
if
(
i2
==
last_i
+
1
)
{
if
(
sum
!=
s
->
sums
[
i2
].
sum1
)
break
;
if
(
memcmp
(
sum2
,
s
->
sums
[
i2
].
sum2
,
s
->
s2length
)
!=
0
)
break
;
/* we've found an adjacent match - the RLL coder
will be happy */
/* we've found an adjacent match - the RLL coder
*
will be happy */
i
=
i2
;
break
;
}
}
last_i
=
i
;
matched
(
f
,
s
,
buf
,
offset
,
i
);
offset
+=
s
->
sums
[
i
].
len
-
1
;
k
=
MIN
((
len
-
offset
),
s
->
blength
);
...
...
@@ -237,13 +236,13 @@ static void hash_search(int f,struct sum_struct *s,
matches
++
;
break
;
}
null_tag:
/* Trim off the first byte from the checksum */
map
=
(
schar
*
)
map_ptr
(
buf
,
offset
,
k
+
1
);
s1
-=
map
[
0
]
+
CHAR_OFFSET
;
s2
-=
k
*
(
map
[
0
]
+
CHAR_OFFSET
);
/* Add on the next byte (if there is one) to the checksum */
if
(
k
<
(
len
-
offset
))
{
s1
+=
(
map
[
k
]
+
CHAR_OFFSET
);
...
...
@@ -258,13 +257,13 @@ static void hash_search(int f,struct sum_struct *s,
match. The 3 reads are caused by the
running match, the checksum update and the
literal send. */
if
(
offset
>
last_match
&&
offset
-
last_match
>=
CHUNK_SIZE
+
s
->
blength
&&
(
end
-
offset
>
CHUNK_SIZE
)
)
{
if
(
offset
>
last_match
&&
offset
-
last_match
>=
CHUNK_SIZE
+
s
->
blength
&&
end
-
offset
>
CHUNK_SIZE
)
{
matched
(
f
,
s
,
buf
,
offset
-
s
->
blength
,
-
2
);
}
}
while
(
++
offset
<
end
);
matched
(
f
,
s
,
buf
,
len
,
-
1
);
map_ptr
(
buf
,
len
-
1
,
1
);
}
...
...
@@ -292,25 +291,25 @@ void match_sums(int f, struct sum_struct *s, struct map_struct *buf, OFF_T len)
last_match
=
0
;
false_alarms
=
0
;
tag_hits
=
0
;
matches
=
0
;
data_transfer
=
0
;
matches
=
0
;
data_transfer
=
0
;
sum_init
();
if
(
len
>
0
&&
s
->
count
>
0
)
{
build_hash_table
(
s
);
if
(
verbose
>
2
)
if
(
verbose
>
2
)
rprintf
(
FINFO
,
"built hash table
\n
"
);
hash_search
(
f
,
s
,
buf
,
len
);
if
(
verbose
>
2
)
if
(
verbose
>
2
)
rprintf
(
FINFO
,
"done hash search
\n
"
);
}
else
{
OFF_T
j
;
/* by doing this in pieces we avoid too many seeks */
for
(
j
=
0
;
j
<
(
len
-
CHUNK_SIZE
);
j
+=
CHUNK_SIZE
)
{
for
(
j
=
0
;
j
<
len
-
CHUNK_SIZE
;
j
+=
CHUNK_SIZE
)
{
int
n1
=
MIN
(
CHUNK_SIZE
,(
len
-
CHUNK_SIZE
)
-
j
);
matched
(
f
,
s
,
buf
,
j
+
n1
,
-
2
);
}
...
...
@@ -329,11 +328,11 @@ void match_sums(int f, struct sum_struct *s, struct map_struct *buf, OFF_T len)
free
(
targets
);
targets
=
NULL
;
}
if
(
verbose
>
2
)
rprintf
(
FINFO
,
"false_alarms=%d tag_hits=%d matches=%d
\n
"
,
false_alarms
,
tag_hits
,
matches
);
total_tag_hits
+=
tag_hits
;
total_false_alarms
+=
false_alarms
;
total_matches
+=
matches
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment