1/* 2 * Copyright (c) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16use crate::adapter::{ 17 create_dir, error_control, get_parent, next_line, reader_iterator, drop_reader_iterator, seek, cut_file_name, 18 MakeDirectionMode, SeekPos, Str, 19}; 20use libc::{c_char, c_int, c_longlong, c_void}; 21use std::ffi::CString; 22use std::ptr::null_mut; 23 24#[no_mangle] 25pub unsafe extern "C" fn ReaderIterator(path: *const c_char) -> *mut c_void { 26 match reader_iterator(path) { 27 Ok(sv) => sv, 28 Err(e) => { 29 error_control(e); 30 null_mut() 31 } 32 } 33} 34 35#[no_mangle] 36pub unsafe extern "C" fn DropReaderIterator(iter: *mut c_void) { 37 drop_reader_iterator(iter) 38} 39 40#[no_mangle] 41pub unsafe extern "C" fn NextLine(iter: *mut c_void) -> *mut Str { 42 match next_line(iter) { 43 Ok(s) => s, 44 Err(e) => { 45 error_control(e); 46 null_mut() 47 } 48 } 49} 50 51#[no_mangle] 52pub extern "C" fn Lseek(fd: i32, offset: i64, pos: SeekPos) -> c_longlong { 53 match seek(fd, offset, pos) { 54 Ok(pos) => pos as c_longlong, 55 Err(e) => unsafe { 56 error_control(e); 57 -1 58 }, 59 } 60} 61 62#[no_mangle] 63pub extern "C" fn Mkdirs(path: *const c_char, mode: MakeDirectionMode) -> c_int { 64 match create_dir(path, mode) { 65 Ok(_) => 0, 66 Err(e) => unsafe { 67 error_control(e); 68 -1 69 }, 70 } 71} 72 73#[no_mangle] 74pub extern "C" fn GetParent(fd: i32) -> *mut Str { 75 match get_parent(fd) { 76 Ok(str) => str, 77 Err(e) => { 78 unsafe { 79 error_control(e); 80 } 81 null_mut() 82 } 83 } 84} 85 86#[no_mangle] 87pub unsafe extern "C" fn StrFree(str: *mut Str) { 88 if !str.is_null() { 89 let string = Box::from_raw(str); 90 let _ = CString::from_raw(string.str); 91 } 92} 93 94#[no_mangle] 95pub unsafe extern "C" fn CutFileName(path: *const c_char, size: usize) -> *mut Str { 96 cut_file_name(path, size) 97} 98