1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

Optimise _eat_space and _get_token

Makes the code more readable and has a smaller number of memory
accesses thus it's small optimisation as well.

For _get_token() optimize number parsing. Check for '.' char only
if it's not a digit. Move pointer incrementation into one place.

For _eat_space() check only p->te for '\0' in skipping of comment line.
Avoid check for '\0' when we know it is space. Also master while loop
doesn't need checking p->tb for '\0'. We just need to check p->tb
isn't already at the end of buffer. This could give 'extra' loop cycle
if we are already there - but safes memory access in every other case.
This commit is contained in:
Zdenek Kabelac 2011-03-10 14:51:35 +00:00
parent 36b9ec636d
commit 027a55d0fb
2 changed files with 21 additions and 20 deletions

View File

@ -1,5 +1,6 @@
Version 2.02.85 -
===================================
Optimise _get_token() and _eat_space().
Add _lv_postorder_vg() to improve efficiency for all LVs in VG.
Use hash tables to speedup string search in validate_vg().
Refactor allocation of VG structure, add alloc_vg().

View File

@ -822,18 +822,20 @@ static void _get_token(struct parser *p, int tok_prev)
case '+':
case '-':
if (values_allowed) {
te++;
while ((te != p->fe) && (*te)) {
if (*te == '.') {
if (p->t == TOK_FLOAT)
break;
p->t = TOK_FLOAT;
} else if (!isdigit((int) *te))
while (++te != p->fe) {
if (!isdigit((int) *te)) {
if (*te == '.') {
if (p->t != TOK_FLOAT) {
p->t = TOK_FLOAT;
continue;
}
}
break;
te++;
}
}
break;
}
/* fall through */
default:
p->t = TOK_IDENTIFIER;
@ -850,22 +852,20 @@ static void _get_token(struct parser *p, int tok_prev)
static void _eat_space(struct parser *p)
{
while ((p->tb != p->fe) && (*p->tb)) {
while (p->tb != p->fe) {
if (*p->te == '#')
while ((p->te != p->fe) && (*p->te) && (*p->te != '\n'))
p->te++;
while ((p->te != p->fe) && (*p->te != '\n') && (*p->te))
++p->te;
else if (isspace(*p->te)) {
while ((p->te != p->fe) && (*p->te) && isspace(*p->te)) {
if (*p->te == '\n')
p->line++;
p->te++;
}
else if (!isspace(*p->te))
break;
while ((p->te != p->fe) && isspace(*p->te)) {
if (*p->te == '\n')
++p->line;
++p->te;
}
else
return;
p->tb = p->te;
}
}