
#ifndef PP_XREF_H
#define PP_XREF_H

/*
What we call xref is actually "xref section" in PDF spec and what we call section is "xref subsection".
Our ppxref is a list of sections, sorted by xrefsection->first and xrefsection->last bounds. Every section
keeps a list of ppref *refs, enumerated from xrefsection->first to xrefsection->last. To find a reference
by number we make a binary search over sections bounds, then jump to the proper ppref *ref.
*/

typedef struct {
  ppuint first;     // first reference number in section
  ppuint last;      // last reference number in section
  ppref *refs;      // references list
} ppxsec;

struct ppxref {
  ppxsec *sects;    // subsections list
  size_t size;      // actual sections size
  size_t space;     // available sections space
  ppobj trailer;    // trailer dict or stream
  ppuint count;     // count of references in all sections
  ppxref *prev;     // previous xref
  ppdoc *pdf;       // parent pdf to access entries in linearized docs
  size_t offset;    // file offset of xref
  //ppcrypt *crypt;   // per xref encryption state?
};

ppxref * ppxref_create (ppdoc *pdf, size_t initsize, size_t xrefoffset);
ppxsec * ppxref_push_section (ppxref *xref, ppheap *heap);
int ppxref_sort (ppxref *xref);
ppref * ppxref_find_local (ppxref *xref, ppuint refnumber);

#endif