삼항 연산자(if-then-else의 약식, 즉 <...> ? <...> : <...>)도 VFR에서 다음 형식으로 지원된다.
cond( <...> ? <...> : <...> ) EFI_IFR_CONDITIONAL
casts
다음과 같은 간단한 작업이 가능하다.
suppressif 0;
...
endif;
숫자를 bool로 취급할 때는 명시적으로 bool로 변환해야 한다. 그렇지 않으면 찾기 어려운 오류의 원인이 될 수 있다. 예시는 다음과 같다.
suppressif (1 OR 0); // element is present (incorrect)
...
endif;
suppressif ((BOOLEAN)1 OR (BOOLEAN)0); // element is not present (correct)
...
endif;
질의 값을 UINT16과 비교하려면 ideqval 구문을 사용 가능하다.("id equal value"의 약어이다.)
EFI_IFR_EQ_ID_VAL
Summary:
Push TRUE if a question’s value is equal to a 16-bit unsigned integer, otherwise FALSE.
Prototype:
#define EFI_IFR_EQ_ID_VAL_OP 0x12
typedef struct _EFI_IFR_EQ_ID_VAL {
EFI_IFR_OP_HEADER Header;
EFI_QUESTION_ID QuestionId;
UINT16 Value;
} EFI_IFR_EQ_ID_VAL;
Members:
Header Standard opcode header, where OpCode is EFI_IFR_EQ_ID_VAL_OP.
QuestionId Specifies the identifier of the question whose value will be compared.
Value Unsigned integer value to compare against.
Description:
Evaluate the value of the specified question (QuestionId). If the specified question cannot be evaluated as an unsigned integer, then push Undefined. If they are equal, push TRUE. Otherwise push FALSE.
이는 form browser가 다른 요소의 값을 기반으로 요소를 동적으로 숨기거나 표시함을 의미한다.
언어 구문에 어긋나고 정의되지 않은 동작을 유발할 수 있으므로 == 대신 아무 것도 입력하면 안된다. 값이 다른지 테스트하지 않으려면 NOT 키워드를 활용할 수 있다.
suppressif NOT ideqval FormData.OneOfValue == 0x33;
...
endif;
ideqid
ideqid("id equal id"의 약어)은 다음 형식에서 두 질문의 값을 비교할 수 있다.
EFI_IFR_EQ_ID_ID
Summary:
Push TRUE if the two questions have the same value or FALSE if they are not equal.
Prototype:
#define EFI_IFR_EQ_ID_ID_OP 0x13
typedef struct _EFI_IFR_EQ_ID_ID {
EFI_IFR_OP_HEADER Header;
EFI_QUESTION_ID QuestionId1;
EFI_QUESTION_ID QuestionId2;
} EFI_IFR_EQ_ID_ID;
Members:
Header Standard opcode header, where OpCode is EFI_IFR_EQ_ID_ID_OP.
QuestionId1, QuestionId2 Specifies the identifier of the questions whose values will be compared.
Description:
Evaluate the values of the specified questions (QuestionId1, QuestionId2). If the two values cannot be evaluated or cannot be converted to comparable types, then push Undefined. If they are equal, push TRUE. Otherwise push FALSE.
두개의 값이 동일하면 TRUE 동일하지 않으면 FALSE가 반환되며 아래와 같은 양식으로 사용이 가능하다.
위의 명령문(ideqval/ideqvallist/ideqid)은 동등성에 대한 테스트만 허용하며 더 복잡한 계산을 원하면 questionref를 사용 가능하다.
EFI_IFR_QUESTION_REF1
Summary:
Push a question’s value on the expression stack.
Prototype:
#define EFI_IFR_QUESTION_REF1_OP 0x40
typedef struct _EFI_IFR_QUESTION_REF1 {
EFI_IFR_OP_HEADER Header;
EFI_QUESTION_ID QuestionId;
} EFI_IFR_QUESTION_REF1;
Members:
Header The byte sequence that defines the type of opcode as well as the length of the opcode being defined.
Header.OpCode = EFI_IFR_QUESTION_REF1_OP.
QuestionId The question’s identifier, which must be unique within the form set.
Description:
Push the value of the question specified by QuestionId on to the expression stack. If the question’s value cannot be determined or the question does not exist, then push Undefined.
여기서 한 가지 중요한 변경 사항은 질문 참조가 varid(가변)(예:FormData.NumericValue)이 아니라 질문에서 선언해야 하는 name(이름) 필드의 값을 사용한다는 것이다.
name(이름)을 정의하는 코드는 questionref에서 해당 참조 앞에 와야한다. 반대 상황은 빌드 실패로 이어진다.
pushthis
질문 내에서 pushthis 키워드를 사용하여 질문 값을 얻을 수 있으며 이는 EFI_IFR_THIS로 변환된다.
EFI_IFR_THIS
Summary:
Push current question’s value.
Prototype:
#define EFI_IFR_THIS_OP 0x58
typedef struct _EFI_IFR_THIS {
EFI_IFR_OP_HEADER Header;
} EFI_IFR_THIS;
Members:
Header The sequence that defines the type of opcode as well as the length of the opcode being defined.
For this tag, Header.OpCode = EFI_IFR_THIS_OP.
Description:
Push the current question’s value.
예를 들면 아래와 같이 사용된다.
numeric
name = NumericQuestion,
varid = FormData.NumericValue,
prompt = STRING_TOKEN(NUMERIC_PROMPT),
help = STRING_TOKEN(NUMERIC_HELP),
minimum = 5,
maximum = 20,
warningif
prompt = STRING_TOKEN(WARNING_IF_PROMPT),
pushthis == 10
endif;
endnumeric;
이 경우 ideqval 또는 questionref를 사용하여 유사한 결과를 얻을 수 있다. 다음 문은 동일하다.