Parses a string for a comma seperated list of frames & frame ranges * where frames are singular integers and frame ranges are of the following * format: "S-C-I" with S is the start frame, C is the count of frames to dump, * and I the interval between dumped frames. * Valid range strings: "2,3,5", "4-4-2", "3-6, 10-2" */
| 211 | * Valid range strings: "2,3,5", "4-4-2", "3-6, 10-2" |
| 212 | */ |
| 213 | bool parseConditionalFrameRange(std::string range_str) { |
| 214 | uint32_t current_char = 0; |
| 215 | |
| 216 | if (range_str.empty()) { |
| 217 | printErrorMsg("Conditional range error: format string was empty\n"); |
| 218 | return false; |
| 219 | } |
| 220 | |
| 221 | while (current_char < range_str.size()) { |
| 222 | NumberToken frame_number = parseNumber(range_str, current_char); |
| 223 | if (frame_number.length <= 0) { |
| 224 | printErrorMsg("Conditional range error: Invalid frame number\n"); |
| 225 | return false; |
| 226 | } |
| 227 | current_char += frame_number.length; |
| 228 | |
| 229 | // Range of frames |
| 230 | if (range_str[current_char] == '-') { |
| 231 | current_char++; |
| 232 | if (current_char >= range_str.size()) { |
| 233 | printErrorMsg("Conditional range error: Must have number for frame count\n"); |
| 234 | return false; |
| 235 | } |
| 236 | NumberToken frame_count = parseNumber(range_str, current_char); |
| 237 | if (frame_count.length <= 0) { |
| 238 | printErrorMsg("Conditional range error: Invalid frame count\n"); |
| 239 | return false; |
| 240 | } |
| 241 | current_char += frame_count.length; |
| 242 | |
| 243 | if (current_char >= range_str.size()) { |
| 244 | // Frame Range w/o interval |
| 245 | ranges.push_back(FrameRange{frame_number.value, frame_count.value, 1l}); |
| 246 | use_conditional_output = true; |
| 247 | return true; |
| 248 | } |
| 249 | |
| 250 | else if (range_str[current_char] == '-') { |
| 251 | current_char++; |
| 252 | if (current_char >= range_str.size()) { |
| 253 | printErrorMsg("Conditional range error: Must have number for frame interval \n"); |
| 254 | return false; |
| 255 | } |
| 256 | |
| 257 | NumberToken frame_interval = parseNumber(range_str, current_char); |
| 258 | if (frame_interval.length <= 0) { |
| 259 | printErrorMsg("Conditional range error: Invalid interval\n"); |
| 260 | return false; |
| 261 | } |
| 262 | |
| 263 | // Frame Range w/ interval |
| 264 | ranges.push_back(FrameRange{frame_number.value, frame_count.value, frame_interval.value}); |
| 265 | |
| 266 | current_char += frame_interval.length; |
| 267 | if (current_char >= range_str.size()) { |
| 268 | use_conditional_output = true; |
| 269 | return true; |
| 270 | } |