mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-02-17 10:27:41 +00:00
Specification for patterniterate(). dereference visitor.
Copied from Perforce Change: 186433 ServerID: perforce.ravenbrook.com
This commit is contained in:
parent
a42939ecf4
commit
e8f37dd478
1 changed files with 17 additions and 3 deletions
|
|
@ -227,6 +227,20 @@ static void DebugPoolFinish(Pool pool)
|
|||
}
|
||||
|
||||
|
||||
/* patternIterate -- call visitor for occurrences of pattern between
|
||||
* base and limit
|
||||
*
|
||||
* pattern is an arbitrary pattern that's size bytes long.
|
||||
*
|
||||
* Imagine that the entirety of memory were covered by contiguous
|
||||
* copies of pattern starting at address 0. Then call visitor for each
|
||||
* copy (or part) of pattern that lies between base and limit. In each
|
||||
* call, target is the address of the copy or part (where base <=
|
||||
* target < limit); source is the corresponding byte of the pattern
|
||||
* (where pattern <= source < pattern + size); and size is the length
|
||||
* of the copy or part.
|
||||
*/
|
||||
|
||||
static Bool patternIterate(Addr pattern, Size size, Addr base, Addr limit,
|
||||
Bool (*visitor)(Addr target, Addr source, Size size))
|
||||
{
|
||||
|
|
@ -247,18 +261,18 @@ static Bool patternIterate(Addr pattern, Size size, Addr base, Addr limit,
|
|||
break;
|
||||
} else if (p == rounded && end <= limit) {
|
||||
/* Room for a whole copy */
|
||||
if (!visitor(p, pattern, size))
|
||||
if (!(*visitor)(p, pattern, size))
|
||||
return FALSE;
|
||||
p = end;
|
||||
} else if (p < rounded && rounded <= end && rounded <= limit) {
|
||||
/* Copy up to rounded */
|
||||
if (!visitor(p, AddrAdd(pattern, offset), AddrOffset(p, rounded)))
|
||||
if (!(*visitor)(p, AddrAdd(pattern, offset), AddrOffset(p, rounded)))
|
||||
return FALSE;
|
||||
p = rounded;
|
||||
} else {
|
||||
/* Copy up to limit */
|
||||
AVER(limit <= end && (p == rounded || limit <= rounded));
|
||||
if (!visitor(p, AddrAdd(pattern, offset), AddrOffset(p, limit)))
|
||||
if (!(*visitor)(p, AddrAdd(pattern, offset), AddrOffset(p, limit)))
|
||||
return FALSE;
|
||||
p = limit;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue