From 21506801604be992898760ce918969d43132a1fe Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Mon, 5 Jan 2026 17:36:07 -0500 Subject: [PATCH] Update to new Physis Excel API --- Cargo.lock | 14 +++--- src/exd.rs | 25 ++++++---- src/resource.rs | 120 ++++++++++++++++++++++++------------------------ 3 files changed, 84 insertions(+), 75 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5803cb9..ae40bd6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -202,7 +202,7 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "physis" version = "0.6.0" -source = "git+https://github.com/redstrate/physis#06b34af5e415290c37a68ae4d8a4491fa94b0cdd" +source = "git+https://github.com/redstrate/physis#2d7b5962e92e50a10229c72148ae753752f59816" dependencies = [ "binrw", "bitflags", @@ -212,18 +212,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.104" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9695f8df41bb4f3d222c95a67532365f569318332d03d5f3f67f37b20e6ebdf0" +checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.42" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" dependencies = [ "proc-macro2", ] @@ -432,6 +432,6 @@ checksum = "40990edd51aae2c2b6907af74ffb635029d5788228222c4bb811e9351c0caad3" [[package]] name = "zmij" -version = "1.0.10" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30e0d8dffbae3d840f64bda38e28391faef673a7b5a6017840f2a106c8145868" +checksum = "2fc5a66a20078bf1251bde995aa2fdcc4b800c70b5d92dd2c62abc5c60f679f8" diff --git a/src/exd.rs b/src/exd.rs index 7247e93..a7e1bd9 100644 --- a/src/exd.rs +++ b/src/exd.rs @@ -10,7 +10,7 @@ use std::ptr::{null, null_mut}; #[repr(C)] #[allow(dead_code)] -pub enum physis_ColumnData { +pub enum physis_Field { String(*const c_char), Bool(bool), Int8(i8), @@ -27,22 +27,31 @@ pub enum physis_ColumnData { #[repr(C)] pub struct physis_ExcelRow { pub subrow_id: u16, - pub column_data: *mut physis_ColumnData, + pub columns: *mut physis_Field, +} + +impl Default for physis_ExcelRow { + fn default() -> Self { + Self { + subrow_id: 0, + columns: null_mut(), + } + } } #[repr(C)] -pub struct physis_ExcelRows { +pub struct physis_ExcelEntry { pub row_id: u32, - pub row_data: *mut physis_ExcelRow, - pub row_count: c_uint, + pub subrows: *mut physis_ExcelRow, + pub subrow_count: c_uint, } -impl Default for physis_ExcelRows { +impl Default for physis_ExcelEntry { fn default() -> Self { Self { row_id: 0, - row_data: null_mut(), - row_count: 0, + subrows: null_mut(), + subrow_count: 0, } } } diff --git a/src/resource.rs b/src/resource.rs index 0ade79b..2158e4e 100644 --- a/src/resource.rs +++ b/src/resource.rs @@ -1,11 +1,13 @@ // SPDX-FileCopyrightText: 2026 Joshua Goins // SPDX-License-Identifier: GPL-3.0-or-later -use crate::exd::{physis_ColumnData, physis_ExcelRow, physis_ExcelRows}; +use crate::exd::{physis_ExcelEntry, physis_ExcelRow, physis_Field}; use crate::exh::physis_EXH; use crate::{ffi_free_string, ffi_from_c_string, ffi_to_c_string, ffi_to_vec, physis_Buffer}; use physis::common::{Language, Platform}; -use physis::excel::{ColumnData, ExcelRowKind, ExcelSheet}; +use physis::excel::Field; +use physis::excel::Row; +use physis::excel::{Entry, Sheet}; use physis::repository::RepositoryType; use physis::resource::{RepairAction, Resource, SqPackRelease, SqPackResource}; use physis::sqpack::Hash; @@ -99,32 +101,32 @@ pub extern "C" fn physis_sqpack_read( #[repr(C)] pub struct physis_ExcelSheetPage { - pub row_count: c_uint, - pub rows: *const physis_ExcelRows, + pub entry_count: c_uint, + pub entries: *const physis_ExcelEntry, pub column_count: c_uint, } #[unsafe(no_mangle)] pub extern "C" fn physis_excel_page_free_rows( page: &physis_ExcelSheetPage, - rows: &physis_ExcelRows, + rows: &physis_ExcelEntry, ) { unsafe { let data = Vec::from_raw_parts( - rows.row_data, - rows.row_count as usize, - rows.row_count as usize, + rows.subrows, + rows.subrow_count as usize, + rows.subrow_count as usize, ); - for i in 0..rows.row_count { + for i in 0..rows.subrow_count { let col_data = Vec::from_raw_parts( - data[i as usize].column_data, + data[i as usize].columns, page.column_count as usize, page.column_count as usize, ); for col in &col_data { - if let physis_ColumnData::String(s) = col { + if let physis_Field::String(s) = col { ffi_free_string(*s); } } @@ -138,7 +140,7 @@ pub extern "C" fn physis_excel_page_free_rows( #[repr(C)] pub struct physis_ExcelSheet { - p_ptr: *mut ExcelSheet, + p_ptr: *mut Sheet, page_count: u32, pages: *const physis_ExcelSheetPage, } @@ -153,47 +155,17 @@ impl Default for physis_ExcelSheet { } } -fn to_c_row(row_id: u32, row_kind: &ExcelRowKind) -> physis_ExcelRows { - let reduced_rows = match row_kind { - ExcelRowKind::SingleRow(val) => &vec![(0u16, val.clone())], - ExcelRowKind::SubRows(rows) => rows, - }; - +fn to_c_entry(row_id: u32, entry: &Entry) -> physis_ExcelEntry { let mut c_subrows: Vec = Vec::new(); - for (subrow_id, row) in reduced_rows { - let mut c_col_data: Vec = Vec::new(); - - for col_data in &row.columns { - match &col_data { - ColumnData::String(s) => { - c_col_data.push(physis_ColumnData::String(ffi_to_c_string(s))) - } - ColumnData::Bool(b) => c_col_data.push(physis_ColumnData::Bool(*b)), - ColumnData::Int8(i) => c_col_data.push(physis_ColumnData::Int8(*i)), - ColumnData::UInt8(i) => c_col_data.push(physis_ColumnData::UInt8(*i)), - ColumnData::Int16(i) => c_col_data.push(physis_ColumnData::Int16(*i)), - ColumnData::UInt16(i) => c_col_data.push(physis_ColumnData::UInt16(*i)), - ColumnData::Int32(i) => c_col_data.push(physis_ColumnData::Int32(*i)), - ColumnData::UInt32(i) => c_col_data.push(physis_ColumnData::UInt32(*i)), - ColumnData::Float32(i) => c_col_data.push(physis_ColumnData::Float32(*i)), - ColumnData::Int64(i) => c_col_data.push(physis_ColumnData::Int64(*i)), - ColumnData::UInt64(i) => c_col_data.push(physis_ColumnData::UInt64(*i)), - } - } - - c_subrows.push(physis_ExcelRow { - subrow_id: *subrow_id, - column_data: c_col_data.as_mut_ptr(), - }); - - mem::forget(c_col_data); + for (subrow_id, row) in &entry.subrows { + c_subrows.push(to_c_row(*subrow_id, row)); } - let rows = physis_ExcelRows { + let rows = physis_ExcelEntry { row_id, - row_count: c_subrows.len() as u32, - row_data: c_subrows.as_mut_ptr(), + subrow_count: c_subrows.len() as u32, + subrows: c_subrows.as_mut_ptr(), }; mem::forget(c_subrows); @@ -201,6 +173,35 @@ fn to_c_row(row_id: u32, row_kind: &ExcelRowKind) -> physis_ExcelRows { rows } +fn to_c_row(subrow_id: u16, row: &Row) -> physis_ExcelRow { + let mut c_col_data: Vec = Vec::new(); + + for col_data in &row.columns { + match &col_data { + Field::String(s) => c_col_data.push(physis_Field::String(ffi_to_c_string(s))), + Field::Bool(b) => c_col_data.push(physis_Field::Bool(*b)), + Field::Int8(i) => c_col_data.push(physis_Field::Int8(*i)), + Field::UInt8(i) => c_col_data.push(physis_Field::UInt8(*i)), + Field::Int16(i) => c_col_data.push(physis_Field::Int16(*i)), + Field::UInt16(i) => c_col_data.push(physis_Field::UInt16(*i)), + Field::Int32(i) => c_col_data.push(physis_Field::Int32(*i)), + Field::UInt32(i) => c_col_data.push(physis_Field::UInt32(*i)), + Field::Float32(i) => c_col_data.push(physis_Field::Float32(*i)), + Field::Int64(i) => c_col_data.push(physis_Field::Int64(*i)), + Field::UInt64(i) => c_col_data.push(physis_Field::UInt64(*i)), + } + } + + let row = physis_ExcelRow { + subrow_id, + columns: c_col_data.as_mut_ptr(), + }; + + std::mem::forget(c_col_data); + + row +} + #[unsafe(no_mangle)] pub unsafe extern "C" fn physis_sqpack_read_excel_sheet( resource: &physis_SqPackResource, @@ -213,25 +214,24 @@ pub unsafe extern "C" fn physis_sqpack_read_excel_sheet( return physis_ExcelSheet::default(); }; - if let Ok(exd) = (*resource.p_ptr).read_excel_sheet((*exh.p_ptr).clone(), &r_name, language) - { + if let Ok(exd) = (*resource.p_ptr).read_excel_sheet(&*exh.p_ptr, &r_name, language) { let exd = Box::new(exd); let mut c_pages = Vec::new(); for page in &exd.pages { - let mut c_rows = Vec::new(); + let mut c_entries = Vec::new(); - for row in &page.rows { - c_rows.push(to_c_row(row.row_id, &row.kind)); + for row in &page.entries { + c_entries.push(to_c_entry(row.id, row)); } let page = physis_ExcelSheetPage { column_count: (*exh.p_ptr).column_definitions.len() as c_uint, - row_count: page.rows.len() as u32, - rows: c_rows.as_ptr(), + entry_count: page.entries.len() as u32, + entries: c_entries.as_ptr(), }; - mem::forget(c_rows); + mem::forget(c_entries); c_pages.push(page); } @@ -262,14 +262,14 @@ pub extern "C" fn physis_sqpack_free_excel_sheet(sheet: &physis_ExcelSheet) { pub unsafe extern "C" fn physis_excel_get_row( sheet: &physis_ExcelSheet, row_id: u32, -) -> physis_ExcelRows { +) -> physis_ExcelRow { unsafe { - if let Some(row_kind) = (*sheet.p_ptr).get_row(row_id) { - return to_c_row(row_id, &row_kind); + if let Some(row) = (*sheet.p_ptr).row(row_id) { + return to_c_row(0, &row); } } - physis_ExcelRows::default() + physis_ExcelRow::default() } #[repr(C)]