+ }
+ Ok(())
+ }
+
+ // Read record type 7, subtype 7.
+ fn read_mrsets(&mut self, size: u32, count: u32) -> Result<()> {
+ print!("{:08x}: multiple response sets", self.r.stream_position()?);
+ let mut text = self.open_text_record(size, count)?;
+ loop {
+ #[derive(PartialEq, Eq)]
+ enum MrSet {
+ MC,
+ MD,
+ }
+
+ while text.match_byte(b'\n') {}
+ let Some(name) = text.tokenize(b'=') else {
+ break;
+ };
+
+ let (mrset, cat_label_from_counted_values, label_from_var_label) = if text
+ .match_byte(b'C')
+ {
+ if !text.match_byte(b' ') {
+ Err(anyhow!(
+ "missing space following 'C' at offset {} in mrsets record",
+ text.pos
+ ))?;
+ }
+ (MrSet::MC, false, false)
+ } else if text.match_byte(b'D') {
+ (MrSet::MD, false, false)
+ } else if text.match_byte(b'E') {
+ if !text.match_byte(b' ') {
+ Err(anyhow!(
+ "missing space following 'E' at offset {} in mrsets record",
+ text.pos
+ ))?;
+ }
+
+ let pos = text.pos;
+ let Some(number) = text.tokenize(b' ') else {
+ Err(anyhow!(
+ "Missing label source value following `E' at offset {}u in MRSETS record",
+ text.pos
+ ))?
+ };
+
+ let label_from_var_label = if number == b"11" {
+ true
+ } else if number == b"1" {
+ false
+ } else {
+ Err(anyhow!("Unexpected label source value `{}' following `E' at offset {pos} in MRSETS record", String::from_utf8_lossy(number)))?
+ };
+ (MrSet::MD, true, label_from_var_label)
+ } else {
+ Err(anyhow!(
+ "missing `C', `D', or `E' at offset {} in mrsets record",
+ text.pos
+ ))?
+ };
+
+ let counted_value = if mrset == MrSet::MD {
+ Some(text.parse_counted_string()?)
+ } else { None };
+
+ let label = text.parse_counted_string()?;
+
+ let variables = text.tokenize(b'\n');
+
+ print!("\t\"{}\": multiple {} set",
+ String::from_utf8_lossy(name),
+ if mrset == MrSet::MC { "category" } else { "dichotomy" });