/** * Get the key id and put $currentByte after it * @return void */ private function parseKeyId() { // checking every byte, one by one, until first 'not key_id' char is reached for ($this->currentByte = 0; $this->currentByte < $this->keyByteCnt; $this->currentByte++) { if (!isKeyIdChar($this->key[$this->currentByte])) { break; // $this->currentByte now points to a first 'not a key name' char } } // checking if key is empty if ($this->currentByte == 0) { $this->isValid = false; $this->error = _('Invalid item key format.'); } else { $this->keyId = substr($this->key, 0, $this->currentByte); } }
/** * Parse key and parameters and put them into $this->parameters array. * * @param string $key */ private function parseKey($key) { $pos = 0; // checking every byte, one by one, until first 'not key_id' char is reached while (isset($key[$pos])) { if (!isKeyIdChar($key[$pos])) { break; // $pos now points to the first 'not a key name' char } $this->keyId .= $key[$pos++]; } // checking if key is empty if ($pos == 0) { $this->isValid = false; $this->error = $this->errorMessage($key, $pos); return; } // invalid symbol instead of '[', which would be the beginning of params if (isset($key[$pos]) && $key[$pos] != '[') { $this->isValid = false; $this->error = $this->errorMessage($key, $pos); return; } $state = self::STATE_END; $level = 0; $num = 0; while (isset($key[$pos])) { if ($level == 0) { // first square bracket + Zapcat compatibility if ($state == self::STATE_END && $key[$pos] == '[') { $state = self::STATE_NEW; } else { break; } } switch ($state) { // a new parameter started case self::STATE_NEW: switch ($key[$pos]) { case ' ': break; case ',': if ($level == 1) { if (!isset($this->parameters[$num])) { $this->parameters[$num] = ''; } $num++; } break; case '[': $level++; if ($level == 2) { $l = $pos; } break; case ']': if ($level == 1) { if (!isset($this->parameters[$num])) { $this->parameters[$num] = ''; } $num++; } elseif ($level == 2) { $this->parameters[$num] = ''; for ($l++; $l < $pos; $l++) { $this->parameters[$num] .= $key[$l]; } } $level--; $state = self::STATE_END; break; case '"': $state = self::STATE_QUOTED; if ($level == 1) { $l = $pos; } break; default: $state = self::STATE_UNQUOTED; if ($level == 1) { $l = $pos; } } break; // end of parameter // end of parameter case self::STATE_END: switch ($key[$pos]) { case ' ': break; case ',': $state = self::STATE_NEW; if ($level == 1) { if (!isset($this->parameters[$num])) { $this->parameters[$num] = ''; } $num++; } break; case ']': if ($level == 1) { if (!isset($this->parameters[$num])) { $this->parameters[$num] = ''; } $num++; } elseif ($level == 2) { $this->parameters[$num] = ''; for ($l++; $l < $pos; $l++) { $this->parameters[$num] .= $key[$l]; } } $level--; break; default: break 3; } break; // an unquoted parameter // an unquoted parameter case self::STATE_UNQUOTED: if ($key[$pos] == ']' || $key[$pos] == ',') { if ($level == 1) { $this->parameters[$num] = ''; for (; $l < $pos; $l++) { $this->parameters[$num] .= $key[$l]; } } $pos--; $state = self::STATE_END; } break; // a quoted parameter // a quoted parameter case self::STATE_QUOTED: if ($key[$pos] == '"' && $key[$pos - 1] != '\\') { if ($level == 1) { $this->parameters[$num] = ''; for ($l++; $l < $pos; $l++) { if ($key[$l] != '\\' || $key[$l + 1] != '"') { $this->parameters[$num] .= $key[$l]; } } } $state = self::STATE_END; } break; } $pos++; } if ($pos == 0 || isset($key[$pos]) || $level != 0) { $this->isValid = false; $this->error = $this->errorMessage($key, $pos); } }