Skip to content

Commit

Permalink
Rewrite findMarker without tail recursion
Browse files Browse the repository at this point in the history
... to avoid StackOverflowException
  • Loading branch information
joeha480 committed Apr 30, 2019
1 parent 9c0a2d9 commit 688c1d3
Showing 1 changed file with 47 additions and 50 deletions.
97 changes: 47 additions & 50 deletions src/org/daisy/dotify/formatter/impl/search/SearchInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -155,60 +155,57 @@ boolean shouldAdjustOutOfBounds(PageDetails base, MarkerReferenceField markerRef
}
}

String findMarker(PageDetails page, MarkerReferenceField markerRef) {
if (page==null) {
return "";
}
if (markerRef.getSearchScope()==MarkerSearchScope.VOLUME || markerRef.getSearchScope()==MarkerSearchScope.DOCUMENT) {
throw new RuntimeException("Marker reference scope not implemented: " + markerRef.getSearchScope());
}
int dir = 1;
int index = 0;
int count = 0;
List<Marker> m;
boolean skipLeading = false;
if (markerRef.getSearchScope() == MarkerReferenceField.MarkerSearchScope.PAGE_CONTENT) {
skipLeading = true;
} else if (markerRef.getSearchScope() == MarkerReferenceField.MarkerSearchScope.SPREAD_CONTENT) {
PageDetails prevPageInVolume = getPageInVolumeWithOffset(page, -1, false);
if (prevPageInVolume == null || !page.isWithinSpreadScope(-1, prevPageInVolume)) {
String findMarker(final PageDetails page, final MarkerReferenceField markerRef) {
PageDetails currentPage = page;
while (currentPage!=null) {
if (markerRef.getSearchScope()==MarkerSearchScope.VOLUME || markerRef.getSearchScope()==MarkerSearchScope.DOCUMENT) {
throw new RuntimeException("Marker reference scope not implemented: " + markerRef.getSearchScope());
}
int dir = 1;
int index = 0;
int count = 0;
List<Marker> m;
boolean skipLeading = false;
if (markerRef.getSearchScope() == MarkerReferenceField.MarkerSearchScope.PAGE_CONTENT) {
skipLeading = true;
} else if (markerRef.getSearchScope() == MarkerReferenceField.MarkerSearchScope.SPREAD_CONTENT) {
PageDetails prevPageInVolume = getPageInVolumeWithOffset(currentPage, -1, false);
if (prevPageInVolume == null || !currentPage.isWithinSpreadScope(-1, prevPageInVolume)) {
skipLeading = true;
}
}
}
if (skipLeading) {
m = page.getContentMarkers();
} else {
m = page.getMarkers();
}
if (markerRef.getSearchDirection() == MarkerReferenceField.MarkerSearchDirection.BACKWARD) {
dir = -1;
index = m.size()-1;
}
while (count < m.size()) {
Marker m2 = m.get(index);
if (m2.getName().equals(markerRef.getName())) {
return m2.getValue();
if (skipLeading) {
m = currentPage.getContentMarkers();
} else {
m = currentPage.getMarkers();
}
if (markerRef.getSearchDirection() == MarkerReferenceField.MarkerSearchDirection.BACKWARD) {
dir = -1;
index = m.size()-1;
}
while (count < m.size()) {
Marker m2 = m.get(index);
if (m2.getName().equals(markerRef.getName())) {
return m2.getValue();
}
index += dir;
count++;
}
if (markerRef.getSearchScope() == MarkerReferenceField.MarkerSearchScope.SEQUENCE ||
markerRef.getSearchScope() == MarkerSearchScope.SHEET && currentPage.isWithinSheetScope(dir) //||
//markerRef.getSearchScope() == MarkerSearchScope.SPREAD && page.isWithinSequenceSpreadScope(dir)
) {
//Keep while moving: next = page.getPageInScope(page.getSequenceParent(), dir, false);
currentPage = currentPage.getPageInScope(getContentsInSequence(currentPage.getSequenceId()), dir, false);
} //else if (markerRef.getSearchScope() == MarkerSearchScope.SPREAD && page.isWithinDocumentSpreadScope(dir)) {
else if ((markerRef.getSearchScope() == MarkerSearchScope.SPREAD ||
markerRef.getSearchScope() == MarkerSearchScope.SPREAD_CONTENT) && isWithinVolumeSpreadScope(currentPage, dir)) {
currentPage = getPageInVolumeWithOffset(currentPage, dir, false);
} else {
currentPage = null;
}
index += dir;
count++;
}
PageDetails next = null;
if (markerRef.getSearchScope() == MarkerReferenceField.MarkerSearchScope.SEQUENCE ||
markerRef.getSearchScope() == MarkerSearchScope.SHEET && page.isWithinSheetScope(dir) //||
//markerRef.getSearchScope() == MarkerSearchScope.SPREAD && page.isWithinSequenceSpreadScope(dir)
) {
//Keep while moving: next = page.getPageInScope(page.getSequenceParent(), dir, false);
next = page.getPageInScope(getContentsInSequence(page.getSequenceId()), dir, false);
} //else if (markerRef.getSearchScope() == MarkerSearchScope.SPREAD && page.isWithinDocumentSpreadScope(dir)) {
else if ((markerRef.getSearchScope() == MarkerSearchScope.SPREAD ||
markerRef.getSearchScope() == MarkerSearchScope.SPREAD_CONTENT) && isWithinVolumeSpreadScope(page, dir)) {
next = getPageInVolumeWithOffset(page, dir, false);
}
if (next!=null) {
return findMarker(next, markerRef);
} else {
return "";
}
return "";
}

private Optional<PageDetails> getPageDetails(PageId p) {
Expand Down

0 comments on commit 688c1d3

Please sign in to comment.