The libcaca font format (version 1)

All types are big endian.

struct
{
magic:
   uint8_t caca_header[2];    // "\xCA\xCA"
   uint8_t caca_file_type[2]; // "FT"

font_header:
   uint32_t control_size;     // Control size (font_data - font_header)
   uint32_t data_size;        // Data size (EOF - font_data)

   uint16_t version;          // Font format version
                              //  bit 0: set to 1 if font is compatible
                              //         with version 1 of the format
                              //  bits 1-15: unused yet, must be 0

   uint16_t blocks;           // Number of blocks in the font
   uint32_t glyphs;           // Total number of glyphs in the font

   uint16_t bpp;              // Bits per pixel for glyph data (valid
                              // Values are 1, 2, 4 and 8)
   uint16_t width;            // Standard glyph width
   uint16_t height;           // Standard glyph height
   uint16_t maxwidth;         // Maximum glyph width
   uint16_t maxheight;        // Maximum glyph height

   uint16_t flags;            // Feature flags
                              //  bit 0: set to 1 if font is fixed width
                              //  bits 1-15: unused yet, must be 0

block_info:
   struct
   {
      uint32_t start;         // Unicode index of the first glyph
      uint32_t stop;          // Unicode index of the last glyph + 1
      uint32_t index;         // Glyph info index of the first glyph
   }
   block_list[blocks];

glyph_info:
   struct
   {
      uint16_t width;         // Glyph width in pixels
      uint16_t height;        // Glyph height in pixels
      uint32_t data_offset;   // Offset (starting from data) to the data
                              // for the first character
   }
   glyph_list[glyphs];

control_extension_1:
control_extension_2:
   ...
control_extension_N:
   ...                        // reserved for future use

font_data:
   uint8_t data[data_size];   // glyph data

data_extension_1:
data_extension_2:
   ...
data_extension_N:
   ...                        // reserved for future use
};