getRange returns the bits indicated by the given expression: number | number "-" number [ "/" number ] or error parsing range.
(expr string, r bounds)
| 250 | // number | number "-" number [ "/" number ] |
| 251 | // or error parsing range. |
| 252 | func getRange(expr string, r bounds) (uint64, error) { |
| 253 | var ( |
| 254 | start, end, step uint |
| 255 | rangeAndStep = strings.Split(expr, "/") |
| 256 | lowAndHigh = strings.Split(rangeAndStep[0], "-") |
| 257 | singleDigit = len(lowAndHigh) == 1 |
| 258 | err error |
| 259 | ) |
| 260 | |
| 261 | var extra uint64 |
| 262 | if lowAndHigh[0] == "*" || lowAndHigh[0] == "?" { |
| 263 | start = r.min |
| 264 | end = r.max |
| 265 | extra = starBit |
| 266 | } else { |
| 267 | start, err = parseIntOrName(lowAndHigh[0], r.names) |
| 268 | if err != nil { |
| 269 | return 0, err |
| 270 | } |
| 271 | switch len(lowAndHigh) { |
| 272 | case 1: |
| 273 | end = start |
| 274 | case 2: |
| 275 | end, err = parseIntOrName(lowAndHigh[1], r.names) |
| 276 | if err != nil { |
| 277 | return 0, err |
| 278 | } |
| 279 | default: |
| 280 | return 0, fmt.Errorf("too many hyphens: %s", expr) |
| 281 | } |
| 282 | } |
| 283 | |
| 284 | switch len(rangeAndStep) { |
| 285 | case 1: |
| 286 | step = 1 |
| 287 | case 2: |
| 288 | step, err = mustParseInt(rangeAndStep[1]) |
| 289 | if err != nil { |
| 290 | return 0, err |
| 291 | } |
| 292 | |
| 293 | // Special handling: "N/step" means "N-max/step". |
| 294 | if singleDigit { |
| 295 | end = r.max |
| 296 | } |
| 297 | if step > 1 { |
| 298 | extra = 0 |
| 299 | } |
| 300 | default: |
| 301 | return 0, fmt.Errorf("too many slashes: %s", expr) |
| 302 | } |
| 303 | |
| 304 | if start < r.min { |
| 305 | return 0, fmt.Errorf("beginning of range (%d) below minimum (%d): %s", start, r.min, expr) |
| 306 | } |
| 307 | if end > r.max { |
| 308 | return 0, fmt.Errorf("end of range (%d) above maximum (%d): %s", end, r.max, expr) |
| 309 | } |