parseBitFieldDefs static method

List<BitFieldDef> parseBitFieldDefs(
  1. String input,
  2. int maxBit
)

Parse multi-line field definitions into BitFieldDef objects.

Accepted formats per line:

  • name high:low (e.g. exponent 31:21)
  • name high (single bit, e.g. sign 31)
  • high:low (unnamed, displayed as [high:low])
  • bit (unnamed single bit, displayed as [bit])

Implementation

static List<BitFieldDef> parseBitFieldDefs(String input, int maxBit) {
  final lines = input.split('\n');
  final fields = <BitFieldDef>[];
  for (final rawLine in lines) {
    final line = rawLine.trim();
    if (line.isEmpty) {
      continue;
    }
    final tokens = _splitAsciiWhitespace(line);

    // Try: name high:low
    final namedRange = tokens.length == 2 && _isWord(tokens[0])
        ? _parseRangeToken(tokens[1])
        : null;
    if (namedRange != null) {
      final name = tokens[0];
      final a = namedRange.$1.clamp(0, maxBit);
      final b = namedRange.$2.clamp(0, maxBit);
      final high = a >= b ? a : b;
      final low = a >= b ? b : a;
      fields.add(BitFieldDef(name: name, high: high, low: low));
      continue;
    }

    // Try: name bit (single bit)
    final namedSingle = tokens.length == 2 &&
        _isWord(tokens[0]) &&
        _isUnsignedDecimal(tokens[1]);
    if (namedSingle) {
      final name = tokens[0];
      final bit = int.parse(tokens[1]).clamp(0, maxBit);
      fields.add(BitFieldDef(name: name, high: bit, low: bit));
      continue;
    }

    // Try: high:low (unnamed)
    final anonRange = tokens.length == 1 ? _parseRangeToken(tokens[0]) : null;
    if (anonRange != null) {
      final a = anonRange.$1.clamp(0, maxBit);
      final b = anonRange.$2.clamp(0, maxBit);
      final high = a >= b ? a : b;
      final low = a >= b ? b : a;
      fields.add(BitFieldDef(name: '[$high:$low]', high: high, low: low));
      continue;
    }

    // Try: single number (unnamed single bit)
    if (tokens.length == 1 && _isUnsignedDecimal(tokens[0])) {
      final bit = int.parse(tokens[0]).clamp(0, maxBit);
      fields.add(BitFieldDef(name: '[$bit]', high: bit, low: bit));
      continue;
    }
  }
  return fields;
}