///|
fn pdf_cursor_read_xref_section(
  cursor : ByteCursor,
) -> PdfXRefSection raise PdfError {
  let position = cursor.absolute_position()
  if pdf_cursor_matches_ascii_at(cursor, position, [120, 114, 101, 102]) {
    let entries = pdf_cursor_read_classic_xref_entries(cursor)
    let trailer = pdf_cursor_read_trailer_dictionary(cursor)
    { entries, trailer, stream_object_number: None, stream_object_offset: None }
  } else {
    pdf_cursor_read_xref_stream_section(cursor)
  }
}

///|
fn pdf_cursor_read_trailer_dictionary(
  cursor : ByteCursor,
) -> PdfObject raise PdfError {
  pdf_cursor_drop_whitespace(cursor)
  pdf_cursor_consume_ascii(
    cursor,
    [116, 114, 97, 105, 108, 101, 114],
    TrailerExpected,
  )
  pdf_cursor_drop_whitespace(cursor)
  let object = pdf_parse_single_lexeme_object(pdf_cursor_lex_tokens(cursor))
  match object {
    PdfDictionary(_) => object
    _ => raise TrailerExpected
  }
}