/** * Get one parameter from command line * @param context * @param parameter * @param mandatory * @return */ scpi_bool_t SCPI_Parameter(scpi_t * context, scpi_parameter_t * parameter, scpi_bool_t mandatory) { lex_state_t * state; if (!parameter) { SCPI_ErrorPush(context, SCPI_ERROR_SYSTEM_ERROR); return FALSE; } invalidateToken(parameter, NULL); state = &context->param_list.lex_state; if (state->pos >= (state->buffer + state->len)) { if (mandatory) { SCPI_ErrorPush(context, SCPI_ERROR_MISSING_PARAMETER); } else { parameter->type = SCPI_TOKEN_PROGRAM_MNEMONIC; // TODO: select something different } return FALSE; } if (context->input_count != 0) { scpiLex_Comma(state, parameter); if (parameter->type != SCPI_TOKEN_COMMA) { invalidateToken(parameter, NULL); SCPI_ErrorPush(context, SCPI_ERROR_INVALID_SEPARATOR); return FALSE; } } context->input_count++; scpiParser_parseProgramData(&context->param_list.lex_state, parameter); switch (parameter->type) { case SCPI_TOKEN_HEXNUM: case SCPI_TOKEN_OCTNUM: case SCPI_TOKEN_BINNUM: case SCPI_TOKEN_PROGRAM_MNEMONIC: case SCPI_TOKEN_DECIMAL_NUMERIC_PROGRAM_DATA: case SCPI_TOKEN_DECIMAL_NUMERIC_PROGRAM_DATA_WITH_SUFFIX: case SCPI_TOKEN_ARBITRARY_BLOCK_PROGRAM_DATA: case SCPI_TOKEN_SINGLE_QUOTE_PROGRAM_DATA: case SCPI_TOKEN_DOUBLE_QUOTE_PROGRAM_DATA: case SCPI_TOKEN_PROGRAM_EXPRESSION: return TRUE; default: invalidateToken(parameter, NULL); SCPI_ErrorPush(context, SCPI_ERROR_INVALID_STRING_DATA); return FALSE; } }
/** * Skip complete command line - program header and parameters * @param state * @param buffer * @param len * @return */ int scpiParser_detectProgramMessageUnit(scpi_parser_state_t * state, char * buffer, int len) { lex_state_t lex_state; scpi_token_t tmp; int result = 0; lex_state.buffer = lex_state.pos = buffer; lex_state.len = len; state->numberOfParameters = 0; /* ignore whitespace at the begginig */ scpiLex_WhiteSpace(&lex_state, &tmp); if (scpiLex_ProgramHeader(&lex_state, &state->programHeader) >= 0) { if (scpiLex_WhiteSpace(&lex_state, &tmp) > 0) { scpiParser_parseAllProgramData(&lex_state, &state->programData, &state->numberOfParameters); } else { invalidateToken(&state->programData, lex_state.pos); } } else { invalidateToken(&state->programHeader, lex_state.buffer); invalidateToken(&state->programData, lex_state.buffer); } if (result == 0) result = scpiLex_NewLine(&lex_state, &tmp); if (result == 0) result = scpiLex_Semicolon(&lex_state, &tmp); if (!scpiLex_IsEos(&lex_state) && (result == 0)) { lex_state.pos++; state->programHeader.len = 1; state->programHeader.type = SCPI_TOKEN_INVALID; invalidateToken(&state->programData, lex_state.buffer); } if (SCPI_TOKEN_SEMICOLON == tmp.type) { state->termination = SCPI_MESSAGE_TERMINATION_SEMICOLON; } else if (SCPI_TOKEN_NL == tmp.type) { state->termination = SCPI_MESSAGE_TERMINATION_NL; } else { state->termination = SCPI_MESSAGE_TERMINATION_NONE; } return lex_state.pos - lex_state.buffer; }
void TokenCredentials::forgetSensitiveData() { invalidateToken(); }