depexparser.c

来自「EFI BIOS是Intel提出的下一代的BIOS标准。这里上传的Edk源代码是」· C语言 代码 · 共 891 行 · 第 1/2 页

C
891
字号

  LeftTrim (Pbegin, length, Pindex);
  if (strncmp (*Pindex, "}", 1) != 0) {
    return FALSE;
  } else {
    (*Pindex)++;
  }

  return TRUE;
}

BOOLEAN
ParseRightFactor (
  IN      INT8      *Pbegin,
  IN      UINT32    length,
  IN OUT  INT8      **Pindex
  )
/*++

Routine Description:

  Parse rightfactor in bool expression.

Arguments:

  Pbegin    The pointer to the string  
  length    length of the string
  Pindex    The pointer of pointer to the next parse character in the string

Returns:

  BOOLEAN   If string is a valid rightfactor expression, return TRUE, otherwise FALSE


--*/
{
  INT8  *Pin;

  Pin = *Pindex;
  LeftTrim (Pbegin, length, Pindex);

  //
  // <rightfactor> ::=AND <term> <rightbool> <rightfactor>
  //
  if (strncmp (*Pindex, OPERATOR_AND, strlen (OPERATOR_AND)) == 0) {
    *Pindex += strlen (OPERATOR_AND);
    LeftTrim (Pbegin, length, Pindex);

    if (ParseTerm (Pbegin, length, Pindex)) {
      LeftTrim (Pbegin, length, Pindex);

      if (ParseRightBool (Pbegin, length, Pindex)) {
        LeftTrim (Pbegin, length, Pindex);
        if (ParseRightFactor (Pbegin, length, Pindex)) {
          return TRUE;
        } else {
          *Pindex = Pin;
        }
      } else {
        *Pindex = Pin;
      }
    } else {
      *Pindex = Pin;
    }
  }
  //
  // <rightfactor> ::=OR <term> <rightbool> <rightfactor>
  //
  if (strncmp (*Pindex, OPERATOR_OR, strlen (OPERATOR_OR)) == 0) {
    *Pindex += strlen (OPERATOR_OR);
    LeftTrim (Pbegin, length, Pindex);

    if (ParseTerm (Pbegin, length, Pindex)) {
      LeftTrim (Pbegin, length, Pindex);

      if (ParseRightBool (Pbegin, length, Pindex)) {
        LeftTrim (Pbegin, length, Pindex);
        if (ParseRightFactor (Pbegin, length, Pindex)) {
          return TRUE;
        } else {
          *Pindex = Pin;
        }
      } else {
        *Pindex = Pin;
      }
    } else {
      *Pindex = Pin;
    }
  }
  //
  // <rightfactor> ::= ''
  //
  *Pindex = Pin;
  return TRUE;
}

BOOLEAN
ParseRightBool (
  IN      INT8      *Pbegin,
  IN      UINT32    length,
  IN OUT  INT8      **Pindex
  )
/*++

Routine Description:

  Parse rightbool in bool expression.

Arguments:

  Pbegin    The pointer to the string  
  length    length of the string
  Pindex    The pointer of pointer to the next parse character in the string

Returns:

  BOOLEAN   If string is a valid rightbool expression, return TRUE, otherwise FALSE


--*/
{
  INT8  *Pin;

  Pin = *Pindex;
  LeftTrim (Pbegin, length, Pindex);

  //
  // <rightbool>::= AND <term><rightbool>
  //
  if (strncmp (*Pindex, OPERATOR_AND, strlen (OPERATOR_AND)) == 0) {
    *Pindex += strlen (OPERATOR_AND);
    LeftTrim (Pbegin, length, Pindex);

    if (ParseTerm (Pbegin, length, Pindex)) {
      LeftTrim (Pbegin, length, Pindex);

      if (ParseRightBool (Pbegin, length, Pindex)) {
        return TRUE;
      } else {
        *Pindex = Pin;
      }
    } else {
      *Pindex = Pin;
    }
  }
  //
  // <rightbool>::=  OR <term><rightbool>
  //
  if (strncmp (*Pindex, OPERATOR_OR, strlen (OPERATOR_OR)) == 0) {
    *Pindex += strlen (OPERATOR_OR);
    LeftTrim (Pbegin, length, Pindex);

    if (ParseTerm (Pbegin, length, Pindex)) {
      LeftTrim (Pbegin, length, Pindex);

      if (ParseRightBool (Pbegin, length, Pindex)) {
        return TRUE;
      } else {
        *Pindex = Pin;
      }
    } else {
      *Pindex = Pin;
    }
  }
  //
  // <rightbool>::= ''
  //
  *Pindex = Pin;
  return TRUE;
}

BOOLEAN
ParseFactor (
  IN      INT8      *Pbegin,
  IN      UINT32    length,
  IN OUT  INT8      **Pindex
  )
/*++

Routine Description:

  Parse factor in bool expression.

Arguments:

  Pbegin    The pointer to the string  
  length    length of the string
  Pindex    The pointer of pointer to the next parse character in the string

Returns:

  BOOLEAN   If string is a valid factor, return TRUE, otherwise FALSE


--*/
{
  INT8  *Pin;

  Pin = *Pindex;
  LeftTrim (Pbegin, length, Pindex);

  //
  // <factor>   ::= '('<bool>')'<rightfactor>
  //
  if (strncmp (*Pindex, OPERATOR_LEFT_PARENTHESIS, strlen (OPERATOR_LEFT_PARENTHESIS)) == 0) {
    *Pindex += strlen (OPERATOR_LEFT_PARENTHESIS);
    LeftTrim (Pbegin, length, Pindex);

    if (!ParseBool (Pbegin, length, Pindex)) {
      *Pindex = Pin;
    } else {
      LeftTrim (Pbegin, length, Pindex);

      if (strncmp (*Pindex, OPERATOR_RIGHT_PARENTHESIS, strlen (OPERATOR_RIGHT_PARENTHESIS)) == 0) {
        *Pindex += strlen (OPERATOR_RIGHT_PARENTHESIS);
        LeftTrim (Pbegin, length, Pindex);

        if (ParseRightFactor (Pbegin, length, Pindex)) {
          return TRUE;
        } else {
          *Pindex = Pin;
        }
      }
    }
  }
  //
  // <factor>   ::= NOT <factor> <rightbool> <rightfactor>
  //
  if (strncmp (*Pindex, OPERATOR_NOT, strlen (OPERATOR_NOT)) == 0) {
    *Pindex += strlen (OPERATOR_NOT);
    LeftTrim (Pbegin, length, Pindex);

    if (ParseFactor (Pbegin, length, Pindex)) {
      LeftTrim (Pbegin, length, Pindex);

      if (ParseRightBool (Pbegin, length, Pindex)) {
        LeftTrim (Pbegin, length, Pindex);

        if (ParseRightFactor (Pbegin, length, Pindex)) {
          return TRUE;
        } else {
          *Pindex = Pin;
        }
      } else {
        *Pindex = Pin;
      }
    } else {
      *Pindex = Pin;
    }
  }
  //
  // <factor>   ::= TRUE <rightfactor>
  //
  if (strncmp (*Pindex, OPERATOR_TRUE, strlen (OPERATOR_TRUE)) == 0) {
    *Pindex += strlen (OPERATOR_TRUE);
    LeftTrim (Pbegin, length, Pindex);

    if (ParseRightFactor (Pbegin, length, Pindex)) {
      return TRUE;
    } else {
      *Pindex = Pin;
    }
  }
  //
  // <factor>   ::= FALSE <rightfactor>
  //
  if (strncmp (*Pindex, OPERATOR_FALSE, strlen (OPERATOR_FALSE)) == 0) {
    *Pindex += strlen (OPERATOR_FALSE);
    LeftTrim (Pbegin, length, Pindex);

    if (ParseRightFactor (Pbegin, length, Pindex)) {
      return TRUE;
    } else {
      *Pindex = Pin;
    }
  }
  //
  // <factor>   ::= <guid> <rightfactor>
  //
  if (ParseGuid (Pbegin, length, Pindex)) {
    LeftTrim (Pbegin, length, Pindex);

    if (ParseRightFactor (Pbegin, length, Pindex)) {
      return TRUE;
    } else {
      *Pindex = Pin;
      return FALSE;
    }
  } else {
    *Pindex = Pin;
    return FALSE;
  }
}

BOOLEAN
ParseTerm (
  IN      INT8      *Pbegin,
  IN      UINT32    length,
  IN OUT  INT8      **Pindex
  )
/*++

Routine Description:

  Parse term in bool expression.

Arguments:

  Pbegin    The pointer to the string  
  length    length of the string
  Pindex    The pointer of pointer to the next parse character in the string

Returns:

  BOOLEAN   If string is a valid term, return TRUE, otherwise FALSE


--*/
{
  INT8  *Pin;

  Pin = *Pindex;
  LeftTrim (Pbegin, length, Pindex);

  //
  // <term>     ::= NOT <factor>
  //
  if (strncmp (*Pindex, OPERATOR_NOT, strlen (OPERATOR_NOT)) == 0) {
    *Pindex += strlen (OPERATOR_NOT);
    LeftTrim (Pbegin, length, Pindex);

    if (!ParseFactor (Pbegin, length, Pindex)) {
      *Pindex = Pin;
    } else {
      return TRUE;
    }
  }
  //
  // <term>     ::=<factor>
  //
  if (ParseFactor (Pbegin, length, Pindex)) {
    return TRUE;
  } else {
    *Pindex = Pin;
    return FALSE;
  }
}

BOOLEAN
ParseBool (
  IN      INT8      *Pbegin,
  IN      UINT32    length,
  IN OUT  INT8      **Pindex
  )
/*++

Routine Description:

  Parse bool expression.

Arguments:

  Pbegin    The pointer to the string  
  length    length of the string
  Pindex    The pointer of pointer to the next parse character in the string

Returns:

  BOOLEAN   If string is a valid bool expression, return TRUE, otherwise FALSE


--*/
{
  INT8  *Pin;
  Pin = *Pindex;
  LeftTrim (Pbegin, length, Pindex);

  if (ParseTerm (Pbegin, length, Pindex)) {
    LeftTrim (Pbegin, length, Pindex);

    if (!ParseRightBool (Pbegin, length, Pindex)) {
      *Pindex = Pin;
      return FALSE;
    } else {
      return TRUE;
    }
  } else {
    *Pindex = Pin;
    return FALSE;
  }
}

BOOLEAN
ParseDepex (
  IN      INT8      *Pbegin,
  IN      UINT32    length
  )
/*++

Routine Description:

  Parse whole dependency expression.

Arguments:

  Pbegin    The pointer to the string  
  length    length of the string

Returns:

  BOOLEAN   If string is a valid dependency expression, return TRUE, otherwise FALSE


--*/
{
  BOOLEAN Result;
  INT8    **Pindex;
  INT8    *temp;

  Result  = FALSE;
  temp    = Pbegin;
  Pindex  = &temp;

  LeftTrim (Pbegin, length, Pindex);
  if (strncmp (*Pindex, OPERATOR_BEFORE, strlen (OPERATOR_BEFORE)) == 0) {
    (*Pindex) += strlen (OPERATOR_BEFORE);
    Result = ParseGuid (Pbegin, length, Pindex);

  } else if (strncmp (*Pindex, OPERATOR_AFTER, strlen (OPERATOR_AFTER)) == 0) {
    (*Pindex) += strlen (OPERATOR_AFTER);
    Result = ParseGuid (Pbegin, length, Pindex);

  } else if (strncmp (*Pindex, OPERATOR_SOR, strlen (OPERATOR_SOR)) == 0) {
    (*Pindex) += strlen (OPERATOR_SOR);
    Result = ParseBool (Pbegin, length, Pindex);

  } else {
    Result = ParseBool (Pbegin, length, Pindex);

  }

  LeftTrim (Pbegin, length, Pindex);
  return (BOOLEAN) (Result && (*Pindex) >= (Pbegin + length));
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?