Skip to content

Commit b89087d

Browse files
authored
Merge pull request tectonic-typesetting#93 from burrbull/lookup
use `Into<Vec<u8>>` instead of `&str`
2 parents 7efeffd + 67abc64 commit b89087d

8 files changed

Lines changed: 69 additions & 74 deletions

File tree

dpx/src/dpx_otl_conf.rs

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,9 @@ unsafe extern "C" fn parse_uc_coverage(
9696
let mut i: i32 = 0;
9797
let mut size: i32 = 0;
9898
*pp = (*pp).offset(1);
99-
let glyphclass = CStr::from_ptr(parse_c_ident(pp, endptr)).to_str().unwrap();
100-
let cvalues = pdf_lookup_dict(gclass, glyphclass)
101-
.expect(&format!("{} not defined...", glyphclass));
99+
let glyphclass = CStr::from_ptr(parse_c_ident(pp, endptr));
100+
let cvalues = pdf_lookup_dict(gclass, glyphclass.to_bytes())
101+
.expect(&format!("{} not defined...", glyphclass.display()));
102102
size = pdf_array_length(cvalues) as i32;
103103
i = 0i32;
104104
while i < size {
@@ -169,13 +169,10 @@ unsafe extern "C" fn add_rule(
169169
let mut i: i32 = 0;
170170
let mut n_unicodes: i32 = 0;
171171
if *first.offset(0) as i32 == '@' as i32 {
172-
let s = CStr::from_ptr(first.offset(1)).to_str().unwrap();
173-
let glyph1_opt = pdf_lookup_dict(gclass, s);
172+
let s = CStr::from_ptr(first.offset(1));
173+
let glyph1_opt = pdf_lookup_dict(gclass, s.to_bytes());
174174
if glyph1_opt.is_none() {
175-
warn!(
176-
"No glyph class \"{}\" found.",
177-
s,
178-
);
175+
warn!("No glyph class \"{}\" found.", s.display());
179176
return;
180177
}
181178
glyph1 = glyph1_opt.unwrap();
@@ -219,14 +216,10 @@ unsafe extern "C" fn add_rule(
219216
}
220217
}
221218
if *second.offset(0) as i32 == '@' as i32 {
222-
let s = CStr::from_ptr(second.offset(1)).to_str().unwrap();
223-
let glyph2_opt =
224-
pdf_lookup_dict(gclass, s);
219+
let s = CStr::from_ptr(second.offset(1));
220+
let glyph2_opt = pdf_lookup_dict(gclass, s.to_bytes());
225221
if glyph2_opt.is_none() {
226-
warn!(
227-
"No glyph class \"{}\" found.",
228-
s,
229-
);
222+
warn!("No glyph class \"{}\" found.", s.display(),);
230223
return;
231224
}
232225
glyph2 = glyph2_opt.unwrap();
@@ -462,13 +455,13 @@ unsafe extern "C" fn parse_block(
462455
});
463456
skip_white(pp, endptr);
464457
tmp = parse_c_ident(pp, endptr);
465-
let tmp_s = CStr::from_ptr(tmp).to_str().unwrap();
458+
let tmp_s = CStr::from_ptr(tmp);
466459
if verbose > 0i32 {
467-
info!("otl_conf>> Reading option \"{}\"\n", tmp_s,);
460+
info!("otl_conf>> Reading option \"{}\"\n", tmp_s.display(),);
468461
}
469462
skip_white(pp, endptr);
470463
opt_rule = parse_block(gclass, pp, endptr);
471-
pdf_add_dict(opt_dict, tmp_s, opt_rule);
464+
pdf_add_dict(opt_dict, tmp_s.to_bytes(), opt_rule);
472465
free(tmp as *mut libc::c_void);
473466
} else if token_s == "prefered" || token_s == "required" || token_s == "optional" {
474467
let mut rule_block: *mut pdf_obj = 0 as *mut pdf_obj;
@@ -604,8 +597,7 @@ pub unsafe extern "C" fn otl_conf_find_opt(
604597
let mut options: *mut pdf_obj = 0 as *mut pdf_obj;
605598
assert!(!conf.is_null());
606599
if let Some(options) = pdf_lookup_dict(conf, "option").filter(|_| !opt_tag.is_null()) {
607-
pdf_lookup_dict(options, CStr::from_ptr(opt_tag).to_str().unwrap())
608-
.unwrap_or(0 as *mut pdf_obj)
600+
pdf_lookup_dict(options, CStr::from_ptr(opt_tag).to_bytes()).unwrap_or(0 as *mut pdf_obj)
609601
} else {
610602
0 as *mut pdf_obj
611603
}

dpx/src/dpx_pdfdoc.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,7 @@ unsafe extern "C" fn pdf_doc_close_docinfo(mut p: *mut pdf_doc) {
525525
];
526526
let mut value: *mut pdf_obj = 0 as *mut pdf_obj;
527527
for key in KEYS.iter() {
528-
if let Some(value) = pdf_lookup_dict(docinfo, key) {
528+
if let Some(value) = pdf_lookup_dict(docinfo, *key) {
529529
if !(pdf_obj_typeof(value) == PdfObjType::STRING) {
530530
warn!("\"{}\" in DocInfo dictionary not string type.", key,);
531531
pdf_remove_dict(docinfo, key);
@@ -607,22 +607,22 @@ pub unsafe extern "C" fn pdf_doc_add_page_resource(
607607
resource_ref = pdf_ref_obj(resource_ref)
608608
/* leak */
609609
}
610-
let resource_name = CStr::from_ptr(resource_name).to_str().unwrap();
610+
let resource_name = CStr::from_ptr(resource_name);
611611
resources = pdf_doc_get_page_resources(p, category);
612-
if pdf_lookup_dict(resources, resource_name)
612+
if pdf_lookup_dict(resources, resource_name.to_bytes())
613613
.filter(|duplicate| pdf_compare_reference(*duplicate, resource_ref) != 0)
614614
.is_some()
615615
{
616616
warn!(
617617
"Conflicting page resource found (page: {}, category: {}, name: {}).",
618618
pdf_doc_current_page_number(),
619619
category,
620-
resource_name,
620+
resource_name.display(),
621621
);
622622
warn!("Ignoring...");
623623
pdf_release_obj(resource_ref);
624624
} else {
625-
pdf_add_dict(resources, resource_name, resource_ref);
625+
pdf_add_dict(resources, resource_name.to_bytes(), resource_ref);
626626
};
627627
}
628628
unsafe extern "C" fn doc_flush_page(

dpx/src/dpx_pdfobj.rs

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1152,15 +1152,17 @@ pub unsafe extern "C" fn pdf_set_string(
11521152
};
11531153
}
11541154
/* Name does *not* include the /. */
1155-
pub unsafe fn pdf_new_name(name: &str) -> *mut pdf_obj {
1155+
pub unsafe fn pdf_new_name<K>(name: K) -> *mut pdf_obj
1156+
where
1157+
K: Into<Vec<u8>>,
1158+
{
11561159
let mut result: *mut pdf_obj = 0 as *mut pdf_obj;
11571160
let mut data: *mut pdf_name = 0 as *mut pdf_name;
11581161
result = pdf_new_obj(PdfObjType::NAME);
11591162
data = new(::std::mem::size_of::<pdf_name>() as u32) as *mut pdf_name;
11601163
(*result).data = data as *mut libc::c_void;
1161-
let length = name.len();
11621164
let name = CString::new(name).unwrap();
1163-
if length != 0 {
1165+
if name.to_bytes().len() != 0 {
11641166
(*data).name = name.into_raw();
11651167
} else {
11661168
(*data).name = 0 as *mut i8
@@ -1447,12 +1449,10 @@ unsafe extern "C" fn release_dict(mut data: *mut pdf_dict) {
14471449
}
14481450
/* Array is ended by a node with NULL this pointer */
14491451
/* pdf_add_dict returns 0 if the key is new and non-zero otherwise */
1450-
#[no_mangle]
1451-
pub unsafe extern "C" fn pdf_add_dict(
1452-
mut dict: *mut pdf_obj,
1453-
key: &str,
1454-
mut value: *mut pdf_obj,
1455-
) -> i32 {
1452+
pub unsafe fn pdf_add_dict<K>(mut dict: *mut pdf_obj, key: K, mut value: *mut pdf_obj) -> i32
1453+
where
1454+
K: Into<Vec<u8>> + AsRef<[u8]>,
1455+
{
14561456
let mut data: *mut pdf_dict = 0 as *mut pdf_dict;
14571457
let mut new_node: *mut pdf_dict = 0 as *mut pdf_dict;
14581458
if dict.is_null() || !(*dict).is_dict() {
@@ -1470,7 +1470,7 @@ pub unsafe extern "C" fn pdf_add_dict(
14701470
/* If this key already exists, simply replace the value */
14711471
data = (*dict).data as *mut pdf_dict;
14721472
while !(*data).key.is_null() {
1473-
if key == pdf_name_value(&*(*data).key).to_string_lossy() {
1473+
if key.as_ref() == pdf_name_value(&*(*data).key).to_bytes() {
14741474
/* Release the old value */
14751475
pdf_release_obj((*data).value);
14761476
(*data).value = value;
@@ -1526,7 +1526,7 @@ pub unsafe extern "C" fn pdf_merge_dict(mut dict1: *mut pdf_obj, mut dict2: *mut
15261526
pdf_add_dict(
15271527
dict1,
15281528
//pdf_link_obj((*data).key),
1529-
pdf_name_value(&*(*data).key).to_str().unwrap(),
1529+
pdf_name_value(&*(*data).key).to_bytes(),
15301530
pdf_link_obj((*data).value),
15311531
);
15321532
data = (*data).next
@@ -1558,11 +1558,11 @@ pub unsafe extern "C" fn pdf_foreach_dict(
15581558
}
15591559
error
15601560
}
1561-
#[no_mangle]
1562-
pub unsafe extern "C" fn pdf_lookup_dict(
1563-
mut dict: *mut pdf_obj,
1564-
name: &str,
1565-
) -> Option<*mut pdf_obj> {
1561+
1562+
pub unsafe fn pdf_lookup_dict<K>(mut dict: *mut pdf_obj, name: K) -> Option<*mut pdf_obj>
1563+
where
1564+
K: AsRef<[u8]>,
1565+
{
15661566
let mut data: *mut pdf_dict = 0 as *mut pdf_dict;
15671567
if dict.is_null() || !(*dict).is_dict() {
15681568
panic!(
@@ -1574,7 +1574,7 @@ pub unsafe extern "C" fn pdf_lookup_dict(
15741574
}
15751575
data = (*dict).data as *mut pdf_dict;
15761576
while !(*data).key.is_null() {
1577-
if name == pdf_name_value(&*(*data).key).to_string_lossy() {
1577+
if name.as_ref() == pdf_name_value(&*(*data).key).to_bytes() {
15781578
return Some((*data).value);
15791579
}
15801580
data = (*data).next
@@ -1605,8 +1605,11 @@ pub unsafe extern "C" fn pdf_dict_keys(mut dict: *mut pdf_obj) -> *mut pdf_obj {
16051605
}
16061606
keys
16071607
}
1608-
#[no_mangle]
1609-
pub unsafe extern "C" fn pdf_remove_dict(mut dict: *mut pdf_obj, name: &str) {
1608+
1609+
pub unsafe fn pdf_remove_dict<K>(mut dict: *mut pdf_obj, name: K)
1610+
where
1611+
K: AsRef<[u8]>,
1612+
{
16101613
let mut data: *mut pdf_dict = 0 as *mut pdf_dict;
16111614
let mut data_p: *mut *mut pdf_dict = 0 as *mut *mut pdf_dict;
16121615
if dict.is_null() || !(*dict).is_dict() {
@@ -1621,8 +1624,8 @@ pub unsafe extern "C" fn pdf_remove_dict(mut dict: *mut pdf_obj, name: &str) {
16211624
data_p = &mut (*dict).data as *mut *mut libc::c_void as *mut libc::c_void as *mut *mut pdf_dict;
16221625
while !(*data).key.is_null() {
16231626
if !(*data).key.is_null()
1624-
&& (CStr::from_ptr((*((*(*data).key).data as *mut pdf_name)).name).to_string_lossy()
1625-
== name)
1627+
&& (CStr::from_ptr((*((*(*data).key).data as *mut pdf_name)).name).to_bytes()
1628+
== name.as_ref())
16261629
{
16271630
pdf_release_obj((*data).key);
16281631
pdf_release_obj((*data).value);
@@ -4533,7 +4536,7 @@ unsafe extern "C" fn import_dict(
45334536
if tmp.is_null() {
45344537
return -1i32;
45354538
}
4536-
pdf_add_dict(copy, pdf_name_value(&*key).to_str().unwrap(), tmp); // TODO: check
4539+
pdf_add_dict(copy, pdf_name_value(&*key).to_bytes(), tmp); // TODO: check
45374540
0i32
45384541
}
45394542
static mut loop_marker: pdf_obj = {

dpx/src/dpx_pdfparse.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -744,7 +744,7 @@ pub unsafe extern "C" fn parse_pdf_dict(
744744
warn!("Could not find a value in dictionary object.");
745745
return 0 as *mut pdf_obj;
746746
}
747-
pdf_add_dict(result, pdf_name_value(&*key).to_str().unwrap(), value); // TODO: check
747+
pdf_add_dict(result, pdf_name_value(&*key).to_bytes(), value);
748748
skip_white(&mut p, endptr);
749749
}
750750
if p.offset(2) > endptr

dpx/src/dpx_pkfont.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -774,7 +774,7 @@ pub unsafe extern "C" fn pdf_font_load_pkfont(mut font: *mut pdf_font) -> i32 {
774774
}
775775
pdf_add_dict(
776776
charprocs,
777-
CStr::from_ptr(charname).to_str().unwrap(),
777+
CStr::from_ptr(charname).to_bytes(),
778778
pdf_ref_obj(charproc),
779779
);
780780
pdf_release_obj(charproc);

dpx/src/specials/html.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ unused_assignments,
2929
unused_mut
3030
)]
3131

32-
use std::ffi::{CStr, CString};
33-
use crate::DisplayExt;
3432
use crate::dpx_error::dpx_warning;
33+
use crate::DisplayExt;
34+
use std::ffi::{CStr, CString};
3535

3636
use crate::dpx_pdfdraw::{pdf_dev_concat, pdf_dev_transform};
3737
use crate::dpx_pdfximage::{
@@ -52,9 +52,9 @@ use crate::dpx_pdfdoc::{
5252
};
5353
use crate::dpx_pdfdraw::{pdf_dev_grestore, pdf_dev_gsave, pdf_dev_rectclip};
5454
use crate::dpx_pdfobj::{
55-
pdf_add_array, pdf_add_dict, pdf_link_obj, pdf_lookup_dict, pdf_new_array,
56-
pdf_new_boolean, pdf_new_dict, pdf_new_name, pdf_new_null, pdf_new_number, pdf_new_string,
57-
pdf_obj, pdf_obj_typeof, pdf_ref_obj, pdf_release_obj, pdf_string_value, PdfObjType,
55+
pdf_add_array, pdf_add_dict, pdf_link_obj, pdf_lookup_dict, pdf_new_array, pdf_new_boolean,
56+
pdf_new_dict, pdf_new_name, pdf_new_null, pdf_new_number, pdf_new_string, pdf_obj,
57+
pdf_obj_typeof, pdf_ref_obj, pdf_release_obj, pdf_string_value, PdfObjType,
5858
};
5959
use crate::mfree;
6060
use crate::streq_ptr;
@@ -244,7 +244,7 @@ unsafe extern "C" fn read_html_tag(
244244
}
245245
pdf_add_dict(
246246
attr,
247-
CStr::from_ptr(kp).to_str().unwrap(), // TODO: check
247+
CStr::from_ptr(kp).to_bytes(),
248248
pdf_new_string(vp as *const libc::c_void, strlen(vp).wrapping_add(1) as _),
249249
);
250250
free(kp as *mut libc::c_void);

dpx/src/specials/pdfm.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
)]
3131

3232
use crate::warn;
33+
use crate::DisplayExt;
3334
use crate::TTInputFormat;
3435
use crate::{streq_ptr, strstartswith};
3536

@@ -294,11 +295,14 @@ unsafe extern "C" fn safeputresdent(
294295
mut dp: *mut libc::c_void,
295296
) -> i32 {
296297
assert!(!kp.is_null() && !vp.is_null() && !dp.is_null());
297-
let key = pdf_name_value(&*kp).to_str().unwrap();
298-
if pdf_lookup_dict(dp as *mut pdf_obj, key).is_some() {
299-
warn!("Object \"{}\" already defined in dict! (ignored)", key);
298+
let key = pdf_name_value(&*kp);
299+
if pdf_lookup_dict(dp as *mut pdf_obj, key.to_bytes()).is_some() {
300+
warn!(
301+
"Object \"{}\" already defined in dict! (ignored)",
302+
key.display()
303+
);
300304
} else {
301-
pdf_add_dict(dp as *mut pdf_obj, key, pdf_link_obj(vp));
305+
pdf_add_dict(dp as *mut pdf_obj, key.to_bytes(), pdf_link_obj(vp));
302306
}
303307
0i32
304308
}
@@ -309,10 +313,10 @@ unsafe extern "C" fn safeputresdict(
309313
) -> i32 {
310314
let mut key: *mut i8 = 0 as *mut i8;
311315
assert!(!kp.is_null() && !vp.is_null() && !dp.is_null());
312-
let key = pdf_name_value(&*kp).to_str().unwrap();
313-
let dict = pdf_lookup_dict(dp as *mut pdf_obj, key);
316+
let key = pdf_name_value(&*kp);
317+
let dict = pdf_lookup_dict(dp as *mut pdf_obj, key.to_bytes());
314318
if (*vp).is_indirect() {
315-
pdf_add_dict(dp as *mut pdf_obj, key, pdf_link_obj(vp));
319+
pdf_add_dict(dp as *mut pdf_obj, key.to_bytes(), pdf_link_obj(vp));
316320
} else if pdf_obj_typeof(vp) == PdfObjType::DICT {
317321
if let Some(dict) = dict {
318322
pdf_foreach_dict(
@@ -328,12 +332,12 @@ unsafe extern "C" fn safeputresdict(
328332
dict as *mut libc::c_void,
329333
);
330334
} else {
331-
pdf_add_dict(dp as *mut pdf_obj, key, pdf_link_obj(vp));
335+
pdf_add_dict(dp as *mut pdf_obj, key.to_bytes(), pdf_link_obj(vp));
332336
}
333337
} else {
334338
warn!(
335339
"Invalid type (not DICT) for page/form resource dict entry: key=\"{}\"",
336-
key,
340+
key.display(),
337341
);
338342
return -1i32;
339343
}

dpx/src/specials/tpic.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@ use crate::dpx_pdfdraw::{
5151
pdf_dev_setmiterlimit,
5252
};
5353
use crate::dpx_pdfobj::{
54-
pdf_add_dict, pdf_foreach_dict, pdf_get_version, pdf_lookup_dict,
55-
pdf_name_value, pdf_new_boolean, pdf_new_dict, pdf_new_name, pdf_new_number, pdf_new_string,
56-
pdf_obj, pdf_obj_typeof, pdf_ref_obj, pdf_release_obj, pdf_string_value, PdfObjType,
54+
pdf_add_dict, pdf_foreach_dict, pdf_get_version, pdf_lookup_dict, pdf_name_value,
55+
pdf_new_boolean, pdf_new_dict, pdf_new_name, pdf_new_number, pdf_new_string, pdf_obj,
56+
pdf_obj_typeof, pdf_ref_obj, pdf_release_obj, pdf_string_value, PdfObjType,
5757
};
5858
use crate::dpx_pdfparse::parse_val_ident;
5959
use libc::{atof, free, memcmp, sprintf, strlen};
@@ -821,19 +821,15 @@ unsafe extern "C" fn spc_parse_kvpairs(mut ap: *mut spc_arg) -> *mut pdf_obj {
821821
} else {
822822
pdf_add_dict(
823823
dict,
824-
CStr::from_ptr(kp).to_str().unwrap(),
824+
CStr::from_ptr(kp).to_bytes(),
825825
pdf_new_string(vp as *const libc::c_void, strlen(vp).wrapping_add(1) as _),
826826
);
827827
free(vp as *mut libc::c_void);
828828
}
829829
}
830830
} else {
831831
/* Treated as 'flag' */
832-
pdf_add_dict(
833-
dict,
834-
CStr::from_ptr(kp).to_str().unwrap(),
835-
pdf_new_boolean(1_i8),
836-
);
832+
pdf_add_dict(dict, CStr::from_ptr(kp).to_bytes(), pdf_new_boolean(1_i8));
837833
}
838834
free(kp as *mut libc::c_void);
839835
if error == 0 {

0 commit comments

Comments
 (0)