まあ、これは少し古風かもしれませんが、それは単純で、これ以上速いものはありません。
void scanWhite(char*& p){
while(*p==' ') p++;
}
bool seeInt(char*& p, int& num){
scanWhite(p);
char* p1 = p;
bool bNegative = false;
if (*p=='-'){bNegative = true; p++;)
if (!isdigit(*p){p = p1; return false;}
num = 0;
while(isdigit(*p)){
num *= 10;
num += (*p - '0');
p++;
}
if (bNegative) num = - num;
return true;
}
bool seeWord(char*& p, char* word){
scanWhite(p);
int len = strlen(word);
if (strncmp(p, word, len)==0 && !isalphanumeric(p[len])){
p += len;
return true;
}
else return false;
}
bool seeChar(char*& p, char c){
scanWhite(p);
if (*p != c) return false;
p++;
return true;
}
bool parseTranslateRect(char*& p
, int& x0, int& y0, int& x1, int& y1
, int& dx, int& dy
)
{
if (!seeChar(p, '(')) return false;
if (!seeWord(p, "translate")) return false;
if (!seeChar(p, '(')) return false;
if (!seeWord(p, "rect")) return false;
if (!seeInt(p, &x0)) return false;
if (!seeInt(p, &y0)) return false;
if (!seeInt(p, &x1)) return false;
if (!seeInt(p, &y1)) return false;
if (!seeChar(p, ')')) return false;
if (!seeInt(p, &dx)) return false;
if (!seeInt(p, &dy)) return false;
if (!seeChar(p, ')')) return false;
return true;
}
「(translate(rect ...」」のコピーが多数ある場合は、falseが返されるまで解析ルーチンを繰り返し呼び出します。