Пример #1
0
 /**
  * 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);
     }
 }
Пример #2
0
 /**
  * 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);
     }
 }