use std::io::Write;
use tectonic_errors::prelude::*;
use crate::{
symbols::{SymbolCategory, SymbolTable},
FormatVersion,
};
#[derive(Clone, Copy, Debug)]
pub struct EtexPenaltiesPar {
name: &'static str,
since: FormatVersion,
}
const ETEX_PENALTIES_PARS: &[EtexPenaltiesPar] = &[
EtexPenaltiesPar {
name: "inter_line_penalties",
since: 0,
},
EtexPenaltiesPar {
name: "club_penalties",
since: 0,
},
EtexPenaltiesPar {
name: "widow_penalties",
since: 0,
},
EtexPenaltiesPar {
name: "display_widow_penalties",
since: 0,
},
];
pub fn get_etex_penalties_pars_for_version(
version: FormatVersion,
symbols: &mut SymbolTable,
) -> Result<Vec<EtexPenaltiesPar>> {
let mut r = Vec::new();
let mut n = 0;
for p in ETEX_PENALTIES_PARS {
if version >= p.since {
r.push(*p);
symbols.add(
SymbolCategory::EtexPenaltiesPars,
format!("ETEX_PENALTIES_PAR__{}", p.name.to_lowercase()),
n,
)?;
n += 1;
}
}
symbols.add(SymbolCategory::EtexPenaltiesPars, "NUM_ETEX_PENALTIES", n)?;
Ok(r)
}
pub fn emit_c_header_primitives<W: Write>(pars: &[EtexPenaltiesPar], mut stream: W) -> Result<()> {
for par in pars {
writeln!(
stream,
" {{ \"{}\", SET_SHAPE, ETEX_PEN_BASE + ETEX_PENALTIES_PAR__{}, xf_prim_init_none }}, \\",
par.name.replace('_', ""),
par.name.to_lowercase(),
)?;
}
Ok(())
}