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