15bebb993Sopenharmony_ci/* 25bebb993Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 35bebb993Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 45bebb993Sopenharmony_ci * you may not use this file except in compliance with the License. 55bebb993Sopenharmony_ci * You may obtain a copy of the License at 65bebb993Sopenharmony_ci * 75bebb993Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 85bebb993Sopenharmony_ci * 95bebb993Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 105bebb993Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 115bebb993Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 125bebb993Sopenharmony_ci * See the License for the specific language governing permissions and 135bebb993Sopenharmony_ci * limitations under the License. 145bebb993Sopenharmony_ci */ 155bebb993Sopenharmony_ci 165bebb993Sopenharmony_ciuse crate::adapter::{ 175bebb993Sopenharmony_ci create_dir, error_control, get_parent, next_line, reader_iterator, drop_reader_iterator, seek, cut_file_name, 185bebb993Sopenharmony_ci MakeDirectionMode, SeekPos, Str, 195bebb993Sopenharmony_ci}; 205bebb993Sopenharmony_ciuse libc::{c_char, c_int, c_longlong, c_void}; 215bebb993Sopenharmony_ciuse std::ffi::CString; 225bebb993Sopenharmony_ciuse std::ptr::null_mut; 235bebb993Sopenharmony_ci 245bebb993Sopenharmony_ci#[no_mangle] 255bebb993Sopenharmony_cipub unsafe extern "C" fn ReaderIterator(path: *const c_char) -> *mut c_void { 265bebb993Sopenharmony_ci match reader_iterator(path) { 275bebb993Sopenharmony_ci Ok(sv) => sv, 285bebb993Sopenharmony_ci Err(e) => { 295bebb993Sopenharmony_ci error_control(e); 305bebb993Sopenharmony_ci null_mut() 315bebb993Sopenharmony_ci } 325bebb993Sopenharmony_ci } 335bebb993Sopenharmony_ci} 345bebb993Sopenharmony_ci 355bebb993Sopenharmony_ci#[no_mangle] 365bebb993Sopenharmony_cipub unsafe extern "C" fn DropReaderIterator(iter: *mut c_void) { 375bebb993Sopenharmony_ci drop_reader_iterator(iter) 385bebb993Sopenharmony_ci} 395bebb993Sopenharmony_ci 405bebb993Sopenharmony_ci#[no_mangle] 415bebb993Sopenharmony_cipub unsafe extern "C" fn NextLine(iter: *mut c_void) -> *mut Str { 425bebb993Sopenharmony_ci match next_line(iter) { 435bebb993Sopenharmony_ci Ok(s) => s, 445bebb993Sopenharmony_ci Err(e) => { 455bebb993Sopenharmony_ci error_control(e); 465bebb993Sopenharmony_ci null_mut() 475bebb993Sopenharmony_ci } 485bebb993Sopenharmony_ci } 495bebb993Sopenharmony_ci} 505bebb993Sopenharmony_ci 515bebb993Sopenharmony_ci#[no_mangle] 525bebb993Sopenharmony_cipub extern "C" fn Lseek(fd: i32, offset: i64, pos: SeekPos) -> c_longlong { 535bebb993Sopenharmony_ci match seek(fd, offset, pos) { 545bebb993Sopenharmony_ci Ok(pos) => pos as c_longlong, 555bebb993Sopenharmony_ci Err(e) => unsafe { 565bebb993Sopenharmony_ci error_control(e); 575bebb993Sopenharmony_ci -1 585bebb993Sopenharmony_ci }, 595bebb993Sopenharmony_ci } 605bebb993Sopenharmony_ci} 615bebb993Sopenharmony_ci 625bebb993Sopenharmony_ci#[no_mangle] 635bebb993Sopenharmony_cipub extern "C" fn Mkdirs(path: *const c_char, mode: MakeDirectionMode) -> c_int { 645bebb993Sopenharmony_ci match create_dir(path, mode) { 655bebb993Sopenharmony_ci Ok(_) => 0, 665bebb993Sopenharmony_ci Err(e) => unsafe { 675bebb993Sopenharmony_ci error_control(e); 685bebb993Sopenharmony_ci -1 695bebb993Sopenharmony_ci }, 705bebb993Sopenharmony_ci } 715bebb993Sopenharmony_ci} 725bebb993Sopenharmony_ci 735bebb993Sopenharmony_ci#[no_mangle] 745bebb993Sopenharmony_cipub extern "C" fn GetParent(fd: i32) -> *mut Str { 755bebb993Sopenharmony_ci match get_parent(fd) { 765bebb993Sopenharmony_ci Ok(str) => str, 775bebb993Sopenharmony_ci Err(e) => { 785bebb993Sopenharmony_ci unsafe { 795bebb993Sopenharmony_ci error_control(e); 805bebb993Sopenharmony_ci } 815bebb993Sopenharmony_ci null_mut() 825bebb993Sopenharmony_ci } 835bebb993Sopenharmony_ci } 845bebb993Sopenharmony_ci} 855bebb993Sopenharmony_ci 865bebb993Sopenharmony_ci#[no_mangle] 875bebb993Sopenharmony_cipub unsafe extern "C" fn StrFree(str: *mut Str) { 885bebb993Sopenharmony_ci if !str.is_null() { 895bebb993Sopenharmony_ci let string = Box::from_raw(str); 905bebb993Sopenharmony_ci let _ = CString::from_raw(string.str); 915bebb993Sopenharmony_ci } 925bebb993Sopenharmony_ci} 935bebb993Sopenharmony_ci 945bebb993Sopenharmony_ci#[no_mangle] 955bebb993Sopenharmony_cipub unsafe extern "C" fn CutFileName(path: *const c_char, size: usize) -> *mut Str { 965bebb993Sopenharmony_ci cut_file_name(path, size) 975bebb993Sopenharmony_ci} 98