Skip to content

Commit 64795a7

Browse files
committed
Port dvi_* variables
1 parent 981dfce commit 64795a7

File tree

5 files changed

+178
-55
lines changed

5 files changed

+178
-55
lines changed
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
use std::cell::RefCell;
2+
use std::ptr;
3+
use tectonic_bridge_core::OutputId;
4+
5+
thread_local! {
6+
pub static DVI_CTX: RefCell<DviCtx> = const { RefCell::new(DviCtx::new()) }
7+
}
8+
9+
pub struct DviCtx {
10+
file: Option<OutputId>,
11+
limit: i32,
12+
ptr: i32,
13+
offset: i32,
14+
gone: i32,
15+
buf: Vec<u8>,
16+
}
17+
18+
impl DviCtx {
19+
const fn new() -> DviCtx {
20+
DviCtx {
21+
file: None,
22+
limit: 0,
23+
ptr: 0,
24+
offset: 0,
25+
gone: 0,
26+
buf: Vec::new(),
27+
}
28+
}
29+
}
30+
31+
#[no_mangle]
32+
pub extern "C" fn dvi_file() -> OutputId {
33+
DVI_CTX.with_borrow(|dvi| dvi.file.unwrap())
34+
}
35+
36+
#[no_mangle]
37+
pub extern "C" fn set_dvi_file(file: OutputId) {
38+
DVI_CTX.with_borrow_mut(|dvi| dvi.file = Some(file))
39+
}
40+
41+
#[no_mangle]
42+
pub extern "C" fn dvi_limit() -> i32 {
43+
DVI_CTX.with_borrow(|dvi| dvi.limit)
44+
}
45+
46+
#[no_mangle]
47+
pub extern "C" fn set_dvi_limit(val: i32) {
48+
DVI_CTX.with_borrow_mut(|dvi| dvi.limit = val)
49+
}
50+
51+
#[no_mangle]
52+
pub extern "C" fn dvi_ptr() -> i32 {
53+
DVI_CTX.with_borrow(|dvi| dvi.ptr)
54+
}
55+
56+
#[no_mangle]
57+
pub extern "C" fn set_dvi_ptr(val: i32) {
58+
DVI_CTX.with_borrow_mut(|dvi| dvi.ptr = val)
59+
}
60+
61+
#[no_mangle]
62+
pub extern "C" fn dvi_offset() -> i32 {
63+
DVI_CTX.with_borrow(|dvi| dvi.offset)
64+
}
65+
66+
#[no_mangle]
67+
pub extern "C" fn set_dvi_offset(val: i32) {
68+
DVI_CTX.with_borrow_mut(|dvi| dvi.offset = val)
69+
}
70+
71+
#[no_mangle]
72+
pub extern "C" fn dvi_gone() -> i32 {
73+
DVI_CTX.with_borrow(|dvi| dvi.gone)
74+
}
75+
76+
#[no_mangle]
77+
pub extern "C" fn set_dvi_gone(val: i32) {
78+
DVI_CTX.with_borrow_mut(|dvi| dvi.gone = val)
79+
}
80+
81+
#[no_mangle]
82+
pub extern "C" fn dvi_buf(idx: usize) -> u8 {
83+
DVI_CTX.with_borrow(|engine| engine.buf[idx])
84+
}
85+
86+
#[no_mangle]
87+
pub extern "C" fn set_dvi_buf(idx: usize, val: u8) {
88+
DVI_CTX.with_borrow_mut(|engine| engine.buf[idx] = val)
89+
}
90+
91+
#[no_mangle]
92+
pub extern "C" fn dvi_buf_ptr(idx: usize) -> *mut u8 {
93+
DVI_CTX.with_borrow_mut(|engine| ptr::from_mut(&mut engine.buf[idx]))
94+
}
95+
96+
#[no_mangle]
97+
pub extern "C" fn resize_dvi_buf(len: usize) {
98+
DVI_CTX.with_borrow_mut(|engine| engine.buf.resize(len, 0))
99+
}
100+
101+
#[no_mangle]
102+
pub extern "C" fn clear_dvi_buf() {
103+
DVI_CTX.with_borrow_mut(|engine| engine.buf.clear())
104+
}

crates/engine_xetex/src/c_api/globals.rs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use crate::c_api::dvi::{DviCtx, DVI_CTX};
12
use crate::c_api::engine::{EngineCtx, ENGINE_CTX};
23
use crate::c_api::hash::{HashCtx, HASH_CTX};
34
use crate::c_api::inputs::{FileCtx, FILE_CTX};
@@ -13,6 +14,7 @@ pub struct Globals<'a, 'b> {
1314
pub hash: &'a mut HashCtx,
1415
pub files: &'a mut FileCtx,
1516
pub out: &'a mut OutputCtx,
17+
pub dvi: &'a mut DviCtx,
1618
}
1719

1820
impl Globals<'_, '_> {
@@ -23,15 +25,18 @@ impl Globals<'_, '_> {
2325
HASH_CTX.with_borrow_mut(|hash| {
2426
FILE_CTX.with_borrow_mut(|files| {
2527
OUTPUT_CTX.with_borrow_mut(|out| {
26-
let mut globals = Globals {
27-
state,
28-
engine,
29-
strings,
30-
hash,
31-
files,
32-
out,
33-
};
34-
f(&mut globals)
28+
DVI_CTX.with_borrow_mut(|dvi| {
29+
let mut globals = Globals {
30+
state,
31+
engine,
32+
strings,
33+
hash,
34+
files,
35+
out,
36+
dvi,
37+
};
38+
f(&mut globals)
39+
})
3540
})
3641
})
3742
})

crates/engine_xetex/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ pub mod c_api {
236236

237237
use tectonic_bridge_core::CoreBridgeState;
238238

239+
mod dvi;
239240
mod engine;
240241
mod errors;
241242
mod globals;

crates/engine_xetex/xetex/xetex-shipout.c

Lines changed: 41 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,9 @@
1313
#define HALF_BUF 8192
1414
#define FNT_NUM_0 171 /* DVI code */
1515

16-
static rust_output_handle_t dvi_file;
1716
static str_number output_file_name;
18-
static eight_bits *dvi_buf = NULL;
19-
static int32_t dvi_limit;
2017
static int32_t g;
2118
static int32_t lq, lr;
22-
static int32_t dvi_ptr;
23-
static int32_t dvi_offset;
24-
static int32_t dvi_gone;
2519
static int32_t down_ptr, right_ptr;
2620
static scaled_t dvi_h, dvi_v;
2721
static internal_font_number dvi_f;
@@ -49,11 +43,11 @@ void
4943
initialize_shipout_variables(void)
5044
{
5145
output_file_name = 0;
52-
dvi_buf = xmalloc_array(eight_bits, DVI_BUF_SIZE);
53-
dvi_limit = DVI_BUF_SIZE;
54-
dvi_ptr = 0;
55-
dvi_offset = 0;
56-
dvi_gone = 0;
46+
resize_dvi_buf(DVI_BUF_SIZE);
47+
set_dvi_limit(DVI_BUF_SIZE);
48+
set_dvi_ptr(0);
49+
set_dvi_offset(0);
50+
set_dvi_gone(0);
5751
down_ptr = TEX_NULL;
5852
right_ptr = TEX_NULL;
5953
cur_s = -1;
@@ -63,16 +57,16 @@ initialize_shipout_variables(void)
6357
void
6458
deinitialize_shipout_variables(void)
6559
{
66-
free(dvi_buf);
67-
dvi_buf = NULL;
60+
clear_dvi_buf();
6861
}
6962

7063

7164
static inline void
7265
dvi_out(eight_bits c)
7366
{
74-
dvi_buf[dvi_ptr++] = c;
75-
if (dvi_ptr == dvi_limit)
67+
set_dvi_buf(dvi_ptr(), c);
68+
set_dvi_ptr(dvi_ptr()+1);
69+
if (dvi_ptr() == dvi_limit())
7670
dvi_swap();
7771
}
7872

@@ -183,8 +177,8 @@ ship_out(int32_t p)
183177
if (job_name() == 0)
184178
open_log_file();
185179
pack_job_name(output_file_extension);
186-
dvi_file = ttstub_output_open(name_of_file(), 0);
187-
if (dvi_file == INVALID_HANDLE)
180+
set_dvi_file(ttstub_output_open(name_of_file(), 0));
181+
if (dvi_file() == INVALID_HANDLE)
188182
_tt_abort("cannot open output file \"%s\"", name_of_file());
189183
output_file_name = make_name_string();
190184
}
@@ -213,7 +207,7 @@ ship_out(int32_t p)
213207

214208
/* ... resuming 662 ... Emit per-page preamble. */
215209

216-
page_loc = dvi_offset + dvi_ptr;
210+
page_loc = dvi_offset() + dvi_ptr();
217211

218212
dvi_out(BOP);
219213

@@ -547,7 +541,7 @@ hlist_out(void)
547541
if (cur_s > max_push)
548542
max_push = cur_s;
549543

550-
save_loc = dvi_offset + dvi_ptr;
544+
save_loc = dvi_offset() + dvi_ptr();
551545
base_line = cur_v;
552546
prev_p = this_box + 5; /* this is list_offset, the offset of the box list pointer */
553547

@@ -1136,7 +1130,7 @@ vlist_out(void)
11361130
if (cur_s > max_push)
11371131
max_push = cur_s;
11381132

1139-
save_loc = dvi_offset + dvi_ptr;
1133+
save_loc = dvi_offset() + dvi_ptr();
11401134
left_edge = cur_h;
11411135
synctex_vlist(this_box);
11421136

@@ -1884,7 +1878,7 @@ movement(scaled_t w, eight_bits o)
18841878

18851879
q = get_node(MOVEMENT_NODE_SIZE);
18861880
mem_ptr(q + 1)->b32.s1 = w;
1887-
mem_ptr(q + 2)->b32.s1 = dvi_offset + dvi_ptr;
1881+
mem_ptr(q + 2)->b32.s1 = dvi_offset() + dvi_ptr();
18881882

18891883
if (o == DOWN1) {
18901884
mem_ptr(q)->b32.s1 = down_ptr;
@@ -1904,13 +1898,13 @@ movement(scaled_t w, eight_bits o)
19041898
case (MOV_NONE_SEEN + MOV_Y_OK):
19051899
case (MOV_Z_SEEN + MOV_YZ_OK):
19061900
case (MOV_Z_SEEN + MOV_Y_OK):
1907-
if (mem(p + 2).b32.s1 < dvi_gone) {
1901+
if (mem(p + 2).b32.s1 < dvi_gone()) {
19081902
goto not_found;
19091903
} else { /*633:*/
1910-
k = mem(p + 2).b32.s1 - dvi_offset;
1904+
k = mem(p + 2).b32.s1 - dvi_offset();
19111905
if (k < 0)
19121906
k = k + DVI_BUF_SIZE;
1913-
dvi_buf[k] = dvi_buf[k] + 5;
1907+
set_dvi_buf(k, dvi_buf(k) + 5);
19141908
mem_ptr(p)->b32.s0 = MOV_Y_HERE;
19151909
goto found;
19161910
}
@@ -1919,13 +1913,13 @@ movement(scaled_t w, eight_bits o)
19191913
case (MOV_NONE_SEEN + MOV_Z_OK):
19201914
case (MOV_Y_SEEN + MOV_YZ_OK):
19211915
case (MOV_Y_SEEN + MOV_Z_OK):
1922-
if (mem(p + 2).b32.s1 < dvi_gone) {
1916+
if (mem(p + 2).b32.s1 < dvi_gone()) {
19231917
goto not_found;
19241918
} else { /*634:*/
1925-
k = mem(p + 2).b32.s1 - dvi_offset;
1919+
k = mem(p + 2).b32.s1 - dvi_offset();
19261920
if (k < 0)
19271921
k = k + DVI_BUF_SIZE;
1928-
dvi_buf[k] = dvi_buf[k] + 10;
1922+
set_dvi_buf(k, dvi_buf(k) + 10);
19291923
mem_ptr(p)->b32.s0 = MOV_Z_HERE;
19301924
goto found;
19311925
}
@@ -2310,7 +2304,7 @@ finalize_dvi_file(void)
23102304

23112305
dvi_out(POST);
23122306
dvi_four(last_bop);
2313-
last_bop = dvi_offset + dvi_ptr - 5;
2307+
last_bop = dvi_offset() + dvi_ptr() - 5;
23142308
dvi_four(25400000L); /* magic values: conversion ratio for sp */
23152309
dvi_four(473628672L); /* magic values: conversion ratio for sp */
23162310
prepare_mag();
@@ -2336,25 +2330,25 @@ finalize_dvi_file(void)
23362330
else
23372331
dvi_out(XDV_ID_BYTE);
23382332

2339-
k = 4 + (DVI_BUF_SIZE - dvi_ptr) % 4;
2333+
k = 4 + (DVI_BUF_SIZE - dvi_ptr()) % 4;
23402334

23412335
while (k > 0) {
23422336
dvi_out(223);
23432337
k--;
23442338
}
23452339

2346-
if (dvi_limit == HALF_BUF)
2340+
if (dvi_limit() == HALF_BUF)
23472341
write_to_dvi(HALF_BUF, DVI_BUF_SIZE - 1);
23482342

2349-
if (dvi_ptr > TEX_INFINITY - dvi_offset) {
2343+
if (dvi_ptr() > TEX_INFINITY - dvi_offset()) {
23502344
cur_s = -2;
23512345
fatal_error("dvi length exceeds 0x7FFFFFFF");
23522346
}
23532347

2354-
if (dvi_ptr > 0)
2355-
write_to_dvi(0, dvi_ptr - 1);
2348+
if (dvi_ptr() > 0)
2349+
write_to_dvi(0, dvi_ptr() - 1);
23562350

2357-
k = ttstub_output_close(dvi_file);
2351+
k = ttstub_output_close(dvi_file());
23582352

23592353
if (k == 0) {
23602354
print_nl_cstr("Output written on ");
@@ -2366,7 +2360,7 @@ finalize_dvi_file(void)
23662360
else
23672361
print_cstr(" page");
23682362
print_cstr(", ");
2369-
print_int(dvi_offset + dvi_ptr);
2363+
print_int(dvi_offset() + dvi_ptr());
23702364
print_cstr(" bytes).");
23712365
} else {
23722366
print_nl_cstr("Error ");
@@ -2387,30 +2381,30 @@ write_to_dvi(int32_t a, int32_t b)
23872381
{
23882382
int32_t n = b - a + 1;
23892383

2390-
if (ttstub_output_write (dvi_file, (char *) &dvi_buf[a], n) != n)
2384+
if (ttstub_output_write (dvi_file(), (char *) dvi_buf_ptr(a), n) != n)
23912385
_tt_abort ("failed to write data to XDV file");
23922386
}
23932387

23942388

23952389
static void
23962390
dvi_swap(void)
23972391
{
2398-
if (dvi_ptr > (TEX_INFINITY - dvi_offset)) {
2392+
if (dvi_ptr() > (TEX_INFINITY - dvi_offset())) {
23992393
cur_s = -2;
24002394
fatal_error("dvi length exceeds 0x7FFFFFFF");
24012395
}
24022396

2403-
if (dvi_limit == DVI_BUF_SIZE) {
2397+
if (dvi_limit() == DVI_BUF_SIZE) {
24042398
write_to_dvi(0, HALF_BUF - 1);
2405-
dvi_limit = HALF_BUF;
2406-
dvi_offset = dvi_offset + DVI_BUF_SIZE;
2407-
dvi_ptr = 0;
2399+
set_dvi_limit(HALF_BUF);
2400+
set_dvi_offset(dvi_offset() + DVI_BUF_SIZE);
2401+
set_dvi_ptr(0);
24082402
} else {
24092403
write_to_dvi(HALF_BUF, DVI_BUF_SIZE - 1);
2410-
dvi_limit = DVI_BUF_SIZE;
2404+
set_dvi_limit(DVI_BUF_SIZE);
24112405
}
24122406

2413-
dvi_gone = dvi_gone + HALF_BUF;
2407+
set_dvi_gone(dvi_gone() + HALF_BUF);
24142408
}
24152409

24162410

@@ -2445,8 +2439,9 @@ dvi_two(UTF16_code s)
24452439
static void
24462440
dvi_pop(int32_t l)
24472441
{
2448-
if (l == dvi_offset + dvi_ptr && dvi_ptr > 0)
2449-
dvi_ptr--;
2450-
else
2442+
if (l == dvi_offset() + dvi_ptr() && dvi_ptr() > 0) {
2443+
set_dvi_ptr(dvi_ptr()-1);
2444+
} else {
24512445
dvi_out(POP);
2446+
}
24522447
}

0 commit comments

Comments
 (0)