Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
libscpi/src/expression.c@0:be95bfb06686, 2022-01-17 (annotated)
- Committer:
- wuliqunyy
- Date:
- Mon Jan 17 13:20:09 2022 +0000
- Revision:
- 0:be95bfb06686
a working non_flat + adc_didt for ehp regulation version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
wuliqunyy | 0:be95bfb06686 | 1 | /*- |
wuliqunyy | 0:be95bfb06686 | 2 | * BSD 2-Clause License |
wuliqunyy | 0:be95bfb06686 | 3 | * |
wuliqunyy | 0:be95bfb06686 | 4 | * Copyright (c) 2012-2018, Jan Breuer |
wuliqunyy | 0:be95bfb06686 | 5 | * All rights reserved. |
wuliqunyy | 0:be95bfb06686 | 6 | * |
wuliqunyy | 0:be95bfb06686 | 7 | * Redistribution and use in source and binary forms, with or without |
wuliqunyy | 0:be95bfb06686 | 8 | * modification, are permitted provided that the following conditions are met: |
wuliqunyy | 0:be95bfb06686 | 9 | * |
wuliqunyy | 0:be95bfb06686 | 10 | * * Redistributions of source code must retain the above copyright notice, this |
wuliqunyy | 0:be95bfb06686 | 11 | * list of conditions and the following disclaimer. |
wuliqunyy | 0:be95bfb06686 | 12 | * |
wuliqunyy | 0:be95bfb06686 | 13 | * * Redistributions in binary form must reproduce the above copyright notice, |
wuliqunyy | 0:be95bfb06686 | 14 | * this list of conditions and the following disclaimer in the documentation |
wuliqunyy | 0:be95bfb06686 | 15 | * and/or other materials provided with the distribution. |
wuliqunyy | 0:be95bfb06686 | 16 | * |
wuliqunyy | 0:be95bfb06686 | 17 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
wuliqunyy | 0:be95bfb06686 | 18 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
wuliqunyy | 0:be95bfb06686 | 19 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
wuliqunyy | 0:be95bfb06686 | 20 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE |
wuliqunyy | 0:be95bfb06686 | 21 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
wuliqunyy | 0:be95bfb06686 | 22 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
wuliqunyy | 0:be95bfb06686 | 23 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
wuliqunyy | 0:be95bfb06686 | 24 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
wuliqunyy | 0:be95bfb06686 | 25 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
wuliqunyy | 0:be95bfb06686 | 26 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
wuliqunyy | 0:be95bfb06686 | 27 | */ |
wuliqunyy | 0:be95bfb06686 | 28 | |
wuliqunyy | 0:be95bfb06686 | 29 | /** |
wuliqunyy | 0:be95bfb06686 | 30 | * @file expression.c |
wuliqunyy | 0:be95bfb06686 | 31 | * |
wuliqunyy | 0:be95bfb06686 | 32 | * @brief Expressions handling |
wuliqunyy | 0:be95bfb06686 | 33 | * |
wuliqunyy | 0:be95bfb06686 | 34 | * |
wuliqunyy | 0:be95bfb06686 | 35 | */ |
wuliqunyy | 0:be95bfb06686 | 36 | |
wuliqunyy | 0:be95bfb06686 | 37 | #include "scpi/expression.h" |
wuliqunyy | 0:be95bfb06686 | 38 | #include "scpi/error.h" |
wuliqunyy | 0:be95bfb06686 | 39 | #include "scpi/parser.h" |
wuliqunyy | 0:be95bfb06686 | 40 | |
wuliqunyy | 0:be95bfb06686 | 41 | #include "lexer_private.h" |
wuliqunyy | 0:be95bfb06686 | 42 | |
wuliqunyy | 0:be95bfb06686 | 43 | /** |
wuliqunyy | 0:be95bfb06686 | 44 | * Parse one range or single value |
wuliqunyy | 0:be95bfb06686 | 45 | * @param state lexer state |
wuliqunyy | 0:be95bfb06686 | 46 | * @param isRange return true if parsed expression is range |
wuliqunyy | 0:be95bfb06686 | 47 | * @param valueFrom return parsed value from |
wuliqunyy | 0:be95bfb06686 | 48 | * @param valueTo return parsed value to |
wuliqunyy | 0:be95bfb06686 | 49 | * @return SCPI_EXPR_OK - parsing was succesful |
wuliqunyy | 0:be95bfb06686 | 50 | * SCPI_EXPR_ERROR - parser error |
wuliqunyy | 0:be95bfb06686 | 51 | * SCPI_EXPR_NO_MORE - no more data |
wuliqunyy | 0:be95bfb06686 | 52 | */ |
wuliqunyy | 0:be95bfb06686 | 53 | static scpi_expr_result_t numericRange(lex_state_t * state, scpi_bool_t * isRange, scpi_token_t * valueFrom, scpi_token_t * valueTo) { |
wuliqunyy | 0:be95bfb06686 | 54 | if (scpiLex_DecimalNumericProgramData(state, valueFrom)) { |
wuliqunyy | 0:be95bfb06686 | 55 | if (scpiLex_Colon(state, valueTo)) { |
wuliqunyy | 0:be95bfb06686 | 56 | *isRange = TRUE; |
wuliqunyy | 0:be95bfb06686 | 57 | if (scpiLex_DecimalNumericProgramData(state, valueTo)) { |
wuliqunyy | 0:be95bfb06686 | 58 | return SCPI_EXPR_OK; |
wuliqunyy | 0:be95bfb06686 | 59 | } else { |
wuliqunyy | 0:be95bfb06686 | 60 | return SCPI_EXPR_ERROR; |
wuliqunyy | 0:be95bfb06686 | 61 | } |
wuliqunyy | 0:be95bfb06686 | 62 | } else { |
wuliqunyy | 0:be95bfb06686 | 63 | *isRange = FALSE; |
wuliqunyy | 0:be95bfb06686 | 64 | return SCPI_EXPR_OK; |
wuliqunyy | 0:be95bfb06686 | 65 | } |
wuliqunyy | 0:be95bfb06686 | 66 | } |
wuliqunyy | 0:be95bfb06686 | 67 | |
wuliqunyy | 0:be95bfb06686 | 68 | return SCPI_EXPR_NO_MORE; |
wuliqunyy | 0:be95bfb06686 | 69 | } |
wuliqunyy | 0:be95bfb06686 | 70 | |
wuliqunyy | 0:be95bfb06686 | 71 | /** |
wuliqunyy | 0:be95bfb06686 | 72 | * Parse entry on specified position |
wuliqunyy | 0:be95bfb06686 | 73 | * @param context scpi context |
wuliqunyy | 0:be95bfb06686 | 74 | * @param param input parameter |
wuliqunyy | 0:be95bfb06686 | 75 | * @param index index of position (start from 0) |
wuliqunyy | 0:be95bfb06686 | 76 | * @param isRange return true if expression at index was range |
wuliqunyy | 0:be95bfb06686 | 77 | * @param valueFrom return value from |
wuliqunyy | 0:be95bfb06686 | 78 | * @param valueTo return value to |
wuliqunyy | 0:be95bfb06686 | 79 | * @return SCPI_EXPR_OK - parsing was succesful |
wuliqunyy | 0:be95bfb06686 | 80 | * SCPI_EXPR_ERROR - parser error |
wuliqunyy | 0:be95bfb06686 | 81 | * SCPI_EXPR_NO_MORE - no more data |
wuliqunyy | 0:be95bfb06686 | 82 | * @see SCPI_ExprNumericListEntryInt, SCPI_ExprNumericListEntryDouble |
wuliqunyy | 0:be95bfb06686 | 83 | */ |
wuliqunyy | 0:be95bfb06686 | 84 | scpi_expr_result_t SCPI_ExprNumericListEntry(scpi_t * context, scpi_parameter_t * param, int index, scpi_bool_t * isRange, scpi_parameter_t * valueFrom, scpi_parameter_t * valueTo) { |
wuliqunyy | 0:be95bfb06686 | 85 | lex_state_t lex; |
wuliqunyy | 0:be95bfb06686 | 86 | int i; |
wuliqunyy | 0:be95bfb06686 | 87 | scpi_expr_result_t res = SCPI_EXPR_OK; |
wuliqunyy | 0:be95bfb06686 | 88 | |
wuliqunyy | 0:be95bfb06686 | 89 | if (!isRange || !valueFrom || !valueTo || !param) { |
wuliqunyy | 0:be95bfb06686 | 90 | SCPI_ErrorPush(context, SCPI_ERROR_SYSTEM_ERROR); |
wuliqunyy | 0:be95bfb06686 | 91 | return SCPI_EXPR_ERROR; |
wuliqunyy | 0:be95bfb06686 | 92 | } |
wuliqunyy | 0:be95bfb06686 | 93 | |
wuliqunyy | 0:be95bfb06686 | 94 | if (param->type != SCPI_TOKEN_PROGRAM_EXPRESSION) { |
wuliqunyy | 0:be95bfb06686 | 95 | SCPI_ErrorPush(context, SCPI_ERROR_DATA_TYPE_ERROR); |
wuliqunyy | 0:be95bfb06686 | 96 | return SCPI_EXPR_ERROR; |
wuliqunyy | 0:be95bfb06686 | 97 | } |
wuliqunyy | 0:be95bfb06686 | 98 | |
wuliqunyy | 0:be95bfb06686 | 99 | lex.buffer = param->ptr + 1; |
wuliqunyy | 0:be95bfb06686 | 100 | lex.pos = lex.buffer; |
wuliqunyy | 0:be95bfb06686 | 101 | lex.len = param->len - 2; |
wuliqunyy | 0:be95bfb06686 | 102 | |
wuliqunyy | 0:be95bfb06686 | 103 | for (i = 0; i <= index; i++) { |
wuliqunyy | 0:be95bfb06686 | 104 | res = numericRange(&lex, isRange, valueFrom, valueTo); |
wuliqunyy | 0:be95bfb06686 | 105 | if (res != SCPI_EXPR_OK) { |
wuliqunyy | 0:be95bfb06686 | 106 | break; |
wuliqunyy | 0:be95bfb06686 | 107 | } |
wuliqunyy | 0:be95bfb06686 | 108 | if (i != index) { |
wuliqunyy | 0:be95bfb06686 | 109 | if (!scpiLex_Comma(&lex, valueFrom)) { |
wuliqunyy | 0:be95bfb06686 | 110 | res = scpiLex_IsEos(&lex) ? SCPI_EXPR_NO_MORE : SCPI_EXPR_ERROR; |
wuliqunyy | 0:be95bfb06686 | 111 | break; |
wuliqunyy | 0:be95bfb06686 | 112 | } |
wuliqunyy | 0:be95bfb06686 | 113 | } |
wuliqunyy | 0:be95bfb06686 | 114 | } |
wuliqunyy | 0:be95bfb06686 | 115 | |
wuliqunyy | 0:be95bfb06686 | 116 | if (res == SCPI_EXPR_ERROR) { |
wuliqunyy | 0:be95bfb06686 | 117 | SCPI_ErrorPush(context, SCPI_ERROR_EXPRESSION_PARSING_ERROR); |
wuliqunyy | 0:be95bfb06686 | 118 | } |
wuliqunyy | 0:be95bfb06686 | 119 | return res; |
wuliqunyy | 0:be95bfb06686 | 120 | } |
wuliqunyy | 0:be95bfb06686 | 121 | |
wuliqunyy | 0:be95bfb06686 | 122 | /** |
wuliqunyy | 0:be95bfb06686 | 123 | * Parse entry on specified position and convert result to int32_t |
wuliqunyy | 0:be95bfb06686 | 124 | * @param context scpi context |
wuliqunyy | 0:be95bfb06686 | 125 | * @param param input parameter |
wuliqunyy | 0:be95bfb06686 | 126 | * @param index index of position (start from 0) |
wuliqunyy | 0:be95bfb06686 | 127 | * @param isRange return true if expression at index was range |
wuliqunyy | 0:be95bfb06686 | 128 | * @param valueFrom return value from |
wuliqunyy | 0:be95bfb06686 | 129 | * @param valueTo return value to |
wuliqunyy | 0:be95bfb06686 | 130 | * @return SCPI_EXPR_OK - parsing was succesful |
wuliqunyy | 0:be95bfb06686 | 131 | * SCPI_EXPR_ERROR - parser error |
wuliqunyy | 0:be95bfb06686 | 132 | * SCPI_EXPR_NO_MORE - no more data |
wuliqunyy | 0:be95bfb06686 | 133 | * @see SCPI_ExprNumericListEntry, SCPI_ExprNumericListEntryDouble |
wuliqunyy | 0:be95bfb06686 | 134 | */ |
wuliqunyy | 0:be95bfb06686 | 135 | scpi_expr_result_t SCPI_ExprNumericListEntryInt(scpi_t * context, scpi_parameter_t * param, int index, scpi_bool_t * isRange, int32_t * valueFrom, int32_t * valueTo) { |
wuliqunyy | 0:be95bfb06686 | 136 | scpi_expr_result_t res; |
wuliqunyy | 0:be95bfb06686 | 137 | scpi_bool_t range = FALSE; |
wuliqunyy | 0:be95bfb06686 | 138 | scpi_parameter_t paramFrom; |
wuliqunyy | 0:be95bfb06686 | 139 | scpi_parameter_t paramTo; |
wuliqunyy | 0:be95bfb06686 | 140 | |
wuliqunyy | 0:be95bfb06686 | 141 | res = SCPI_ExprNumericListEntry(context, param, index, &range, ¶mFrom, ¶mTo); |
wuliqunyy | 0:be95bfb06686 | 142 | if (res == SCPI_EXPR_OK) { |
wuliqunyy | 0:be95bfb06686 | 143 | *isRange = range; |
wuliqunyy | 0:be95bfb06686 | 144 | SCPI_ParamToInt32(context, ¶mFrom, valueFrom); |
wuliqunyy | 0:be95bfb06686 | 145 | if (range) { |
wuliqunyy | 0:be95bfb06686 | 146 | SCPI_ParamToInt32(context, ¶mTo, valueTo); |
wuliqunyy | 0:be95bfb06686 | 147 | } |
wuliqunyy | 0:be95bfb06686 | 148 | } |
wuliqunyy | 0:be95bfb06686 | 149 | |
wuliqunyy | 0:be95bfb06686 | 150 | return res; |
wuliqunyy | 0:be95bfb06686 | 151 | } |
wuliqunyy | 0:be95bfb06686 | 152 | |
wuliqunyy | 0:be95bfb06686 | 153 | /** |
wuliqunyy | 0:be95bfb06686 | 154 | * Parse entry on specified position and convert result to double |
wuliqunyy | 0:be95bfb06686 | 155 | * @param context scpi context |
wuliqunyy | 0:be95bfb06686 | 156 | * @param param input parameter |
wuliqunyy | 0:be95bfb06686 | 157 | * @param index index of position (start from 0) |
wuliqunyy | 0:be95bfb06686 | 158 | * @param isRange return true if expression at index was range |
wuliqunyy | 0:be95bfb06686 | 159 | * @param valueFrom return value from |
wuliqunyy | 0:be95bfb06686 | 160 | * @param valueTo return value to |
wuliqunyy | 0:be95bfb06686 | 161 | * @return SCPI_EXPR_OK - parsing was succesful |
wuliqunyy | 0:be95bfb06686 | 162 | * SCPI_EXPR_ERROR - parser error |
wuliqunyy | 0:be95bfb06686 | 163 | * SCPI_EXPR_NO_MORE - no more data |
wuliqunyy | 0:be95bfb06686 | 164 | * @see SCPI_ExprNumericListEntry, SCPI_ExprNumericListEntryInt |
wuliqunyy | 0:be95bfb06686 | 165 | */ |
wuliqunyy | 0:be95bfb06686 | 166 | scpi_expr_result_t SCPI_ExprNumericListEntryDouble(scpi_t * context, scpi_parameter_t * param, int index, scpi_bool_t * isRange, double * valueFrom, double * valueTo) { |
wuliqunyy | 0:be95bfb06686 | 167 | scpi_expr_result_t res; |
wuliqunyy | 0:be95bfb06686 | 168 | scpi_bool_t range = FALSE; |
wuliqunyy | 0:be95bfb06686 | 169 | scpi_parameter_t paramFrom; |
wuliqunyy | 0:be95bfb06686 | 170 | scpi_parameter_t paramTo; |
wuliqunyy | 0:be95bfb06686 | 171 | |
wuliqunyy | 0:be95bfb06686 | 172 | res = SCPI_ExprNumericListEntry(context, param, index, &range, ¶mFrom, ¶mTo); |
wuliqunyy | 0:be95bfb06686 | 173 | if (res == SCPI_EXPR_OK) { |
wuliqunyy | 0:be95bfb06686 | 174 | *isRange = range; |
wuliqunyy | 0:be95bfb06686 | 175 | SCPI_ParamToDouble(context, ¶mFrom, valueFrom); |
wuliqunyy | 0:be95bfb06686 | 176 | if (range) { |
wuliqunyy | 0:be95bfb06686 | 177 | SCPI_ParamToDouble(context, ¶mTo, valueTo); |
wuliqunyy | 0:be95bfb06686 | 178 | } |
wuliqunyy | 0:be95bfb06686 | 179 | } |
wuliqunyy | 0:be95bfb06686 | 180 | |
wuliqunyy | 0:be95bfb06686 | 181 | return res; |
wuliqunyy | 0:be95bfb06686 | 182 | } |
wuliqunyy | 0:be95bfb06686 | 183 | |
wuliqunyy | 0:be95bfb06686 | 184 | /** |
wuliqunyy | 0:be95bfb06686 | 185 | * Parse one channel_spec e.g. "1!5!8" |
wuliqunyy | 0:be95bfb06686 | 186 | * @param context |
wuliqunyy | 0:be95bfb06686 | 187 | * @param state lexer state |
wuliqunyy | 0:be95bfb06686 | 188 | * @param values range values |
wuliqunyy | 0:be95bfb06686 | 189 | * @param length length of values array |
wuliqunyy | 0:be95bfb06686 | 190 | * @param dimensions real number of dimensions |
wuliqunyy | 0:be95bfb06686 | 191 | */ |
wuliqunyy | 0:be95bfb06686 | 192 | static scpi_expr_result_t channelSpec(scpi_t * context, lex_state_t * state, int32_t * values, size_t length, size_t * dimensions) { |
wuliqunyy | 0:be95bfb06686 | 193 | scpi_parameter_t param; |
wuliqunyy | 0:be95bfb06686 | 194 | size_t i = 0; |
wuliqunyy | 0:be95bfb06686 | 195 | while (scpiLex_DecimalNumericProgramData(state, ¶m)) { |
wuliqunyy | 0:be95bfb06686 | 196 | if (i < length) { |
wuliqunyy | 0:be95bfb06686 | 197 | SCPI_ParamToInt32(context, ¶m, &values[i]); |
wuliqunyy | 0:be95bfb06686 | 198 | } |
wuliqunyy | 0:be95bfb06686 | 199 | |
wuliqunyy | 0:be95bfb06686 | 200 | if (scpiLex_SpecificCharacter(state, ¶m, '!')) { |
wuliqunyy | 0:be95bfb06686 | 201 | i++; |
wuliqunyy | 0:be95bfb06686 | 202 | } else { |
wuliqunyy | 0:be95bfb06686 | 203 | *dimensions = i + 1; |
wuliqunyy | 0:be95bfb06686 | 204 | return SCPI_EXPR_OK; |
wuliqunyy | 0:be95bfb06686 | 205 | } |
wuliqunyy | 0:be95bfb06686 | 206 | } |
wuliqunyy | 0:be95bfb06686 | 207 | |
wuliqunyy | 0:be95bfb06686 | 208 | if (i == 0) { |
wuliqunyy | 0:be95bfb06686 | 209 | return SCPI_EXPR_NO_MORE; |
wuliqunyy | 0:be95bfb06686 | 210 | } else { |
wuliqunyy | 0:be95bfb06686 | 211 | /* there was at least one number followed by !, but after ! was not another number */ |
wuliqunyy | 0:be95bfb06686 | 212 | return SCPI_EXPR_ERROR; |
wuliqunyy | 0:be95bfb06686 | 213 | } |
wuliqunyy | 0:be95bfb06686 | 214 | } |
wuliqunyy | 0:be95bfb06686 | 215 | |
wuliqunyy | 0:be95bfb06686 | 216 | /** |
wuliqunyy | 0:be95bfb06686 | 217 | * Parse channel_range e.g. "1!2:5!6" |
wuliqunyy | 0:be95bfb06686 | 218 | * @param context |
wuliqunyy | 0:be95bfb06686 | 219 | * @param state lexer state |
wuliqunyy | 0:be95bfb06686 | 220 | * @param isRange return true if it is range |
wuliqunyy | 0:be95bfb06686 | 221 | * @param valuesFrom return array of values from |
wuliqunyy | 0:be95bfb06686 | 222 | * @param valuesTo return array of values to |
wuliqunyy | 0:be95bfb06686 | 223 | * @param length length of values arrays |
wuliqunyy | 0:be95bfb06686 | 224 | * @param dimensions real number of dimensions |
wuliqunyy | 0:be95bfb06686 | 225 | */ |
wuliqunyy | 0:be95bfb06686 | 226 | static scpi_expr_result_t channelRange(scpi_t * context, lex_state_t * state, scpi_bool_t * isRange, int32_t * valuesFrom, int32_t * valuesTo, size_t length, size_t * dimensions) { |
wuliqunyy | 0:be95bfb06686 | 227 | scpi_token_t token; |
wuliqunyy | 0:be95bfb06686 | 228 | scpi_expr_result_t err; |
wuliqunyy | 0:be95bfb06686 | 229 | size_t fromDimensions; |
wuliqunyy | 0:be95bfb06686 | 230 | size_t toDimensions; |
wuliqunyy | 0:be95bfb06686 | 231 | |
wuliqunyy | 0:be95bfb06686 | 232 | err = channelSpec(context, state, valuesFrom, length, &fromDimensions); |
wuliqunyy | 0:be95bfb06686 | 233 | if (err == SCPI_EXPR_OK) { |
wuliqunyy | 0:be95bfb06686 | 234 | if (scpiLex_Colon(state, &token)) { |
wuliqunyy | 0:be95bfb06686 | 235 | *isRange = TRUE; |
wuliqunyy | 0:be95bfb06686 | 236 | err = channelSpec(context, state, valuesTo, length, &toDimensions); |
wuliqunyy | 0:be95bfb06686 | 237 | if (err != SCPI_EXPR_OK) { |
wuliqunyy | 0:be95bfb06686 | 238 | return SCPI_EXPR_ERROR; |
wuliqunyy | 0:be95bfb06686 | 239 | } |
wuliqunyy | 0:be95bfb06686 | 240 | if (fromDimensions != toDimensions) { |
wuliqunyy | 0:be95bfb06686 | 241 | return SCPI_EXPR_ERROR; |
wuliqunyy | 0:be95bfb06686 | 242 | } |
wuliqunyy | 0:be95bfb06686 | 243 | *dimensions = fromDimensions; |
wuliqunyy | 0:be95bfb06686 | 244 | } else { |
wuliqunyy | 0:be95bfb06686 | 245 | *isRange = FALSE; |
wuliqunyy | 0:be95bfb06686 | 246 | *dimensions = fromDimensions; |
wuliqunyy | 0:be95bfb06686 | 247 | return SCPI_EXPR_OK; |
wuliqunyy | 0:be95bfb06686 | 248 | } |
wuliqunyy | 0:be95bfb06686 | 249 | } else if (err == SCPI_EXPR_NO_MORE) { |
wuliqunyy | 0:be95bfb06686 | 250 | err = SCPI_EXPR_ERROR; |
wuliqunyy | 0:be95bfb06686 | 251 | } |
wuliqunyy | 0:be95bfb06686 | 252 | |
wuliqunyy | 0:be95bfb06686 | 253 | return err; |
wuliqunyy | 0:be95bfb06686 | 254 | } |
wuliqunyy | 0:be95bfb06686 | 255 | |
wuliqunyy | 0:be95bfb06686 | 256 | /** |
wuliqunyy | 0:be95bfb06686 | 257 | * Parse one list entry at specific position e.g. "1!2:5!6" |
wuliqunyy | 0:be95bfb06686 | 258 | * @param context |
wuliqunyy | 0:be95bfb06686 | 259 | * @param param |
wuliqunyy | 0:be95bfb06686 | 260 | * @param index |
wuliqunyy | 0:be95bfb06686 | 261 | * @param isRange return true if it is range |
wuliqunyy | 0:be95bfb06686 | 262 | * @param valuesFrom return array of values from |
wuliqunyy | 0:be95bfb06686 | 263 | * @param valuesTo return array of values to |
wuliqunyy | 0:be95bfb06686 | 264 | * @param length length of values arrays |
wuliqunyy | 0:be95bfb06686 | 265 | * @param dimensions real number of dimensions |
wuliqunyy | 0:be95bfb06686 | 266 | */ |
wuliqunyy | 0:be95bfb06686 | 267 | scpi_expr_result_t SCPI_ExprChannelListEntry(scpi_t * context, scpi_parameter_t * param, int index, scpi_bool_t * isRange, int32_t * valuesFrom, int32_t * valuesTo, size_t length, size_t * dimensions) { |
wuliqunyy | 0:be95bfb06686 | 268 | lex_state_t lex; |
wuliqunyy | 0:be95bfb06686 | 269 | int i; |
wuliqunyy | 0:be95bfb06686 | 270 | scpi_expr_result_t res = SCPI_EXPR_OK; |
wuliqunyy | 0:be95bfb06686 | 271 | scpi_token_t token; |
wuliqunyy | 0:be95bfb06686 | 272 | |
wuliqunyy | 0:be95bfb06686 | 273 | if (!isRange || !param || !dimensions || (length && (!valuesFrom || !valuesTo))) { |
wuliqunyy | 0:be95bfb06686 | 274 | SCPI_ErrorPush(context, SCPI_ERROR_SYSTEM_ERROR); |
wuliqunyy | 0:be95bfb06686 | 275 | return SCPI_EXPR_ERROR; |
wuliqunyy | 0:be95bfb06686 | 276 | } |
wuliqunyy | 0:be95bfb06686 | 277 | |
wuliqunyy | 0:be95bfb06686 | 278 | if (param->type != SCPI_TOKEN_PROGRAM_EXPRESSION) { |
wuliqunyy | 0:be95bfb06686 | 279 | SCPI_ErrorPush(context, SCPI_ERROR_DATA_TYPE_ERROR); |
wuliqunyy | 0:be95bfb06686 | 280 | return SCPI_EXPR_ERROR; |
wuliqunyy | 0:be95bfb06686 | 281 | } |
wuliqunyy | 0:be95bfb06686 | 282 | |
wuliqunyy | 0:be95bfb06686 | 283 | lex.buffer = param->ptr + 1; |
wuliqunyy | 0:be95bfb06686 | 284 | lex.pos = lex.buffer; |
wuliqunyy | 0:be95bfb06686 | 285 | lex.len = param->len - 2; |
wuliqunyy | 0:be95bfb06686 | 286 | |
wuliqunyy | 0:be95bfb06686 | 287 | /* detect channel list expression */ |
wuliqunyy | 0:be95bfb06686 | 288 | if (!scpiLex_SpecificCharacter(&lex, &token, '@')) { |
wuliqunyy | 0:be95bfb06686 | 289 | SCPI_ErrorPush(context, SCPI_ERROR_EXPRESSION_PARSING_ERROR); |
wuliqunyy | 0:be95bfb06686 | 290 | return SCPI_EXPR_ERROR; |
wuliqunyy | 0:be95bfb06686 | 291 | } |
wuliqunyy | 0:be95bfb06686 | 292 | |
wuliqunyy | 0:be95bfb06686 | 293 | for (i = 0; i <= index; i++) { |
wuliqunyy | 0:be95bfb06686 | 294 | res = channelRange(context, &lex, isRange, valuesFrom, valuesTo, (i == index) ? length : 0, dimensions); |
wuliqunyy | 0:be95bfb06686 | 295 | if (res != SCPI_EXPR_OK) { |
wuliqunyy | 0:be95bfb06686 | 296 | break; |
wuliqunyy | 0:be95bfb06686 | 297 | } |
wuliqunyy | 0:be95bfb06686 | 298 | if (i != index) { |
wuliqunyy | 0:be95bfb06686 | 299 | if (!scpiLex_Comma(&lex, &token)) { |
wuliqunyy | 0:be95bfb06686 | 300 | res = scpiLex_IsEos(&lex) ? SCPI_EXPR_NO_MORE : SCPI_EXPR_ERROR; |
wuliqunyy | 0:be95bfb06686 | 301 | break; |
wuliqunyy | 0:be95bfb06686 | 302 | } |
wuliqunyy | 0:be95bfb06686 | 303 | } |
wuliqunyy | 0:be95bfb06686 | 304 | } |
wuliqunyy | 0:be95bfb06686 | 305 | |
wuliqunyy | 0:be95bfb06686 | 306 | if (res == SCPI_EXPR_ERROR) { |
wuliqunyy | 0:be95bfb06686 | 307 | SCPI_ErrorPush(context, SCPI_ERROR_EXPRESSION_PARSING_ERROR); |
wuliqunyy | 0:be95bfb06686 | 308 | } |
wuliqunyy | 0:be95bfb06686 | 309 | if (res == SCPI_EXPR_NO_MORE) { |
wuliqunyy | 0:be95bfb06686 | 310 | if (!scpiLex_IsEos(&lex)) { |
wuliqunyy | 0:be95bfb06686 | 311 | res = SCPI_EXPR_ERROR; |
wuliqunyy | 0:be95bfb06686 | 312 | SCPI_ErrorPush(context, SCPI_ERROR_EXPRESSION_PARSING_ERROR); |
wuliqunyy | 0:be95bfb06686 | 313 | } |
wuliqunyy | 0:be95bfb06686 | 314 | } |
wuliqunyy | 0:be95bfb06686 | 315 | return res; |
wuliqunyy | 0:be95bfb06686 | 316 | } |
wuliqunyy | 0:be95bfb06686 | 317 |