Skip to content

Commit 4b50d75

Browse files
committed
Port more_name and make_name_string
1 parent 3f809e4 commit 4b50d75

File tree

4 files changed

+111
-75
lines changed

4 files changed

+111
-75
lines changed

crates/engine_xetex/src/c_api/engine.rs

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use std::{ptr, slice};
66

77
mod memory;
88

9+
use crate::c_api::is_dir_sep;
910
use crate::c_api::pool::{
1011
rs_make_string, rs_search_string, rs_slow_make_string, StringPool, EMPTY_STRING, TOO_BIG_CHAR,
1112
};
@@ -633,6 +634,96 @@ pub fn rs_end_name(globals: &mut Globals<'_, '_>) {
633634
globals.engine.cur_ext = rs_slow_make_string(globals.strings);
634635
}
635636

637+
pub fn rs_more_name(globals: &mut Globals<'_, '_>, c: u16) -> bool {
638+
if globals.engine.stop_at_space && globals.engine.file_name_quote_char == 0 && c == ' ' as u16 {
639+
return false;
640+
}
641+
642+
if globals.engine.stop_at_space
643+
&& globals.engine.file_name_quote_char != 0
644+
&& c == globals.engine.file_name_quote_char
645+
{
646+
globals.engine.file_name_quote_char = 0;
647+
return true;
648+
}
649+
650+
if globals.engine.stop_at_space
651+
&& globals.engine.file_name_quote_char == 0
652+
&& (c == '"' as u16 || c == '\'' as u16)
653+
{
654+
globals.engine.file_name_quote_char = c;
655+
globals.engine.quoted_filename = true;
656+
return true;
657+
}
658+
659+
if globals.strings.pool_ptr + 1 > globals.strings.pool_size {
660+
todo!("overflow(\"pool size\", pool_size() - init_pool_ptr)");
661+
}
662+
663+
globals.strings.str_pool[globals.strings.pool_ptr as usize] = c;
664+
globals.strings.pool_ptr += 1;
665+
666+
if is_dir_sep(char::from_u32(c as u32).unwrap_or(char::REPLACEMENT_CHARACTER)) {
667+
globals.engine.area_delimiter = globals.strings.cur_length();
668+
globals.engine.ext_delimiter = 0;
669+
} else if c == '.' as u16 {
670+
globals.engine.ext_delimiter = globals.strings.cur_length();
671+
}
672+
673+
true
674+
}
675+
676+
pub fn rs_make_name_string(globals: &mut Globals<'_, '_>) -> StrNumber {
677+
if globals.strings.pool_ptr
678+
+ globals
679+
.engine
680+
.name_of_file
681+
.as_ref()
682+
.map(|n| n.count_bytes())
683+
.unwrap_or(0)
684+
> globals.strings.pool_size
685+
|| globals.strings.str_ptr == globals.strings.max_strings
686+
{
687+
return '?' as StrNumber;
688+
}
689+
690+
rs_make_utf16_name(globals.engine);
691+
692+
// TODO: Don't allocate and set name_of_file, just use encode_utf16
693+
if let Some(s) = globals.engine.name_of_file_utf16.as_deref() {
694+
for &c in s {
695+
globals.strings.str_pool[globals.strings.pool_ptr] = c;
696+
globals.strings.pool_ptr += 1;
697+
}
698+
}
699+
700+
let res = rs_make_string(globals.strings);
701+
702+
let save = (
703+
globals.engine.area_delimiter,
704+
globals.engine.ext_delimiter,
705+
globals.engine.name_in_progress,
706+
globals.engine.stop_at_space,
707+
);
708+
globals.engine.name_in_progress = true;
709+
rs_begin_name(globals);
710+
globals.engine.stop_at_space = false;
711+
712+
let name = globals.engine.name_of_file_utf16.take();
713+
// Needed for side-effects
714+
name.as_deref()
715+
.and_then(|s| s.iter().find(|&c| !rs_more_name(globals, *c)));
716+
globals.engine.name_of_file_utf16 = name;
717+
718+
globals.engine.stop_at_space = save.3;
719+
rs_end_name(globals);
720+
globals.engine.name_in_progress = save.2;
721+
globals.engine.ext_delimiter = save.1;
722+
globals.engine.area_delimiter = save.0;
723+
724+
res
725+
}
726+
636727
#[no_mangle]
637728
pub unsafe extern "C" fn maketexstring(str: *const libc::c_char) -> StrNumber {
638729
if str.is_null() {
@@ -676,3 +767,13 @@ pub extern "C" fn begin_name() {
676767
pub extern "C" fn end_name() {
677768
Globals::with(|globals| rs_end_name(globals))
678769
}
770+
771+
#[no_mangle]
772+
pub extern "C" fn more_name(c: u16) -> bool {
773+
Globals::with(|globals| rs_more_name(globals, c))
774+
}
775+
776+
#[no_mangle]
777+
pub extern "C" fn make_name_string() -> StrNumber {
778+
Globals::with(|globals| rs_make_name_string(globals))
779+
}

crates/engine_xetex/src/c_api/pool.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ impl StringPool {
5252
let str = str as usize;
5353
self.str_start[str] as usize..self.str_start[str + 1] as usize
5454
}
55+
56+
/// The length of the current string in the pool
57+
pub fn cur_length(&self) -> usize {
58+
self.pool_ptr - self.str_start[self.str_ptr - TOO_BIG_CHAR] as usize
59+
}
5560
}
5661

5762
#[no_mangle]

crates/engine_xetex/src/lib.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,11 @@ pub mod c_api {
244244
mod pool;
245245
mod scaled_math;
246246

247+
/// Copy of `IS_DIR_SEP` from bridge_core
248+
fn is_dir_sep(c: char) -> bool {
249+
c == '/'
250+
}
251+
247252
#[allow(improper_ctypes)] // for CoreBridgeState
248253
extern "C" {
249254
pub fn tt_xetex_set_int_variable(

crates/engine_xetex/xetex/xetex-xetex0.c

Lines changed: 0 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -10601,81 +10601,6 @@ conditional(void)
1060110601
}
1060210602
}
1060310603

10604-
bool
10605-
more_name(UTF16_code c)
10606-
{
10607-
if (stop_at_space() && file_name_quote_char() == 0 && c == ' ' )
10608-
return false;
10609-
10610-
if (stop_at_space() && file_name_quote_char() != 0 && c == file_name_quote_char()) {
10611-
set_file_name_quote_char(0);
10612-
return true;
10613-
}
10614-
10615-
if (stop_at_space() && file_name_quote_char() == 0 && (c == '"' || c == '\'' )) {
10616-
set_file_name_quote_char(c);
10617-
set_quoted_filename(true);
10618-
return true;
10619-
}
10620-
10621-
if (pool_ptr() + 1 > pool_size())
10622-
overflow("pool size", pool_size() - init_pool_ptr);
10623-
10624-
set_str_pool(pool_ptr(), c);
10625-
set_pool_ptr(pool_ptr()+1);
10626-
10627-
if (IS_DIR_SEP(c)) {
10628-
set_area_delimiter(cur_length());
10629-
set_ext_delimiter(0);
10630-
} else if (c == '.' ) {
10631-
set_ext_delimiter(cur_length());
10632-
}
10633-
10634-
return true;
10635-
}
10636-
10637-
str_number
10638-
make_name_string(void)
10639-
{
10640-
int32_t k;
10641-
pool_pointer save_area_delimiter, save_ext_delimiter;
10642-
bool save_name_in_progress, save_stop_at_space;
10643-
10644-
if (pool_ptr() + name_length() > pool_size() || str_ptr() == max_strings() || cur_length() > 0)
10645-
return '?';
10646-
10647-
make_utf16_name();
10648-
10649-
for (k = 0; k < name_length16(); k++) {
10650-
set_str_pool(pool_ptr(), name_of_file16()[k]);
10651-
set_pool_ptr(pool_ptr()+1);
10652-
}
10653-
10654-
10655-
str_number Result = make_string();
10656-
10657-
save_area_delimiter = area_delimiter();
10658-
save_ext_delimiter = ext_delimiter();
10659-
save_name_in_progress = name_in_progress();
10660-
save_stop_at_space = stop_at_space();
10661-
set_name_in_progress(true);
10662-
begin_name();
10663-
set_stop_at_space(false);
10664-
k = 0;
10665-
10666-
while (k < name_length16() && more_name(name_of_file16()[k]))
10667-
k++;
10668-
10669-
set_stop_at_space(save_stop_at_space);
10670-
end_name();
10671-
set_name_in_progress(save_name_in_progress);
10672-
set_area_delimiter(save_area_delimiter);
10673-
set_ext_delimiter(save_ext_delimiter);
10674-
10675-
return Result;
10676-
}
10677-
10678-
1067910604
static void
1068010605
scan_file_name_braced(void)
1068110606
{

0 commit comments

Comments
 (0)