[Poppler-bugs] [Bug 9405] New: Enhancements to PSTokenizer
performance
bugzilla-daemon at annarchy.freedesktop.org
bugzilla-daemon at annarchy.freedesktop.org
Wed Dec 20 08:59:53 PST 2006
Please do not reply to this email: if you want to comment on the bug, go to
the URL shown below and enter yourcomments there.
https://bugs.freedesktop.org/show_bug.cgi?id=9405
Summary: Enhancements to PSTokenizer performance
Product: poppler
Version: unspecified
Platform: All
OS/Version: All
Status: NEW
Severity: enhancement
Priority: P2
Component: general
AssignedTo: poppler-bugs at lists.freedesktop.org
ReportedBy: scotty1024 at mac.com
Enhance PSTokenizer::getToken
1. Reserve space for terminating 0 by decrementing size in advance (rather than always having to
account for it)
2. Utilize new method consumeChar() to indicate we've used the char returned from lookChar().
3. Made placement of calls to consumeChar() consistent inside parsing code.
Add new method PSTokenizer::consumeChar()
This method is more efficient than getChar() for consuming character returned by lookChar().
Enhance PSTokenizer::getChar()
Changed to reduce writes to charBuffer.
*** PSTokenizer.h.~1.1.1.1.~ Thu Mar 3 11:46:01 2005
--- PSTokenizer.h Wed Dec 20 08:37:09 2006
***************
*** 29,34 ****
--- 29,35 ----
private:
int lookChar();
+ void consumeChar();
int getChar();
int (*getCharFunc)(void *);
*** PSTokenizer.cc.~1.1.1.1.~ Thu Mar 3 11:46:03 2005
--- PSTokenizer.cc Wed Dec 20 08:32:02 2006
***************
*** 55,61 ****
int c;
int i;
! // skip whitespace and comments
comment = gFalse;
while (1) {
if ((c = getChar()) == EOF) {
--- 55,61 ----
int c;
int i;
! // skip leading whitespace and comments
comment = gFalse;
while (1) {
if ((c = getChar()) == EOF) {
***************
*** 74,89 ****
}
}
// read a token
i = 0;
buf[i++] = c;
if (c == '(') {
backslash = gFalse;
while ((c = lookChar()) != EOF) {
! if (i < size - 1) {
buf[i++] = c;
}
- getChar();
if (c == '\\') {
backslash = gTrue;
} else if (!backslash && c == ')') {
--- 74,93 ----
}
}
+ // Reserve room for terminating '\0'
+ size--;
+
// read a token
i = 0;
buf[i++] = c;
+
if (c == '(') {
backslash = gFalse;
while ((c = lookChar()) != EOF) {
! consumeChar();
! if (i < size) {
buf[i++] = c;
}
if (c == '\\') {
backslash = gTrue;
} else if (!backslash && c == ')') {
***************
*** 94,101 ****
}
} else if (c == '<') {
while ((c = lookChar()) != EOF) {
! getChar();
! if (i < size - 1) {
buf[i++] = c;
}
if (c == '>') {
--- 98,105 ----
}
} else if (c == '<') {
while ((c = lookChar()) != EOF) {
! consumeChar();
! if (i < size) {
buf[i++] = c;
}
if (c == '>') {
***************
*** 104,116 ****
}
} else if (c != '[' && c != ']') {
while ((c = lookChar()) != EOF && !specialChars[c]) {
! getChar();
! if (i < size - 1) {
buf[i++] = c;
}
}
}
buf[i] = '\0';
*length = i;
return gTrue;
--- 108,124 ----
}
} else if (c != '[' && c != ']') {
while ((c = lookChar()) != EOF && !specialChars[c]) {
! consumeChar();
! if (i < size) {
buf[i++] = c;
}
}
}
+
+ // Zero terminate token string
buf[i] = '\0';
+
+ // Return length of token
*length = i;
return gTrue;
***************
*** 123,135 ****
return charBuf;
}
int PSTokenizer::getChar() {
! int c;
! if (charBuf < 0) {
! charBuf = (*getCharFunc)(data);
}
! c = charBuf;
! charBuf = -1;
return c;
}
--- 131,148 ----
return charBuf;
}
+ void PSTokenizer::consumeChar() {
+ charBuf = -1;
+ }
+
int PSTokenizer::getChar() {
! int c = charBuf;
! if (c < 0) {
! c = (*getCharFunc)(data);
! } else {
! charBuf = -1;
}
!
return c;
}
--
Configure bugmail: https://bugs.freedesktop.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.
More information about the Poppler-bugs
mailing list