/* Copyright (C) 2015-2020, Dirk Krause SPDX-License-Identifier: BSD-3-Clause */ /* WARNING: This file was generated by the dkct program (see http://dktools.sourceforge.net/ for details). Changes you make here will be lost if dkct is run again! You should modify the original source and run dkct on it. Original source: dk4strmr.ctr */ /** @file dk4strmr.c The dk4strmr module. */ #line 97 "dk4strmr.ctr" #include "dk4conf.h" #if DK4_ON_WINDOWS && DK4_WIN_DENY_CRT #ifndef WINDOWS_H_INCLUDED #include #define WINDOWS_H_INCLUDED 1 #endif #ifndef DK4STRMH_H_INCLUDED #include "dk4strmh.h" #endif #endif #if DK4_HAVE_ASSERT_H #ifndef ASSERT_H_INCLUDED #include #define ASSERT_H_INCLUDED 1 #endif #endif #include "dk4strmr.h" #ifndef DK4FD_H_INCLUDED #include "dk4fd.h" #endif #ifndef DK4PATH_H_INCLUDED #include "dk4pathd.h" #endif #ifndef DK4STRD_H_INCLUDED #include "dk4strd.h" #endif #ifndef DK4FOPD_H_INCLUDED #include "dk4fopd.h" #endif #line 138 "dk4strmr.ctr" /** Compression suffixes. */ static const dkChar * const dk4strmr_co_su[] = { /* 0 */ dkT(".gz"), /* 1 */ dkT(".bz2"), /* 2 */ dkT(".svgz"), NULL #line 149 "dk4strmr.ctr" }; /** File mode for binary reading. */ static const char dk4strmr_c8_mode[] = { "rb" }; /** File mode for binary reading. */ static const dkChar dk4strmr_dk_mode[] = { dkT("rb") }; dk4_stream_t * dk4stream_open_file_reader(const dkChar *filename, dk4_er_t *erp) { dk4_stream_t *back = NULL; /* Function result */ const dkChar *p1 = NULL; /* Suffix pointer */ #if DK4_HAVE_ZLIB_H && (!(DK4_ON_WINDOWS && DK4_WIN_DENY_CRT)) gzFile gzf = NULL; /* gzip compressed input file */ #endif #if DK4_HAVE_BZLIB_H && (!(DK4_ON_WINDOWS && DK4_WIN_DENY_CRT)) BZFILE *bzf = NULL; /* bzip2 compressed input file */ #endif FILE *fipo = NULL; /* Input file */ #if DK4_ON_WINDOWS && DK4_WIN_DENY_CRT HANDLE fha = INVALID_HANDLE_VALUE; DWORD dwattr = (DWORD)0UL; #endif int coi = -1; /* Compression algorithm index */ #if DK4_CHAR_SIZE > 1 int fd = -1; /* File descriptor */ #endif #line 183 "dk4strmr.ctr" #if DK4_USE_ASSERT assert(NULL != filename); #endif if (NULL != filename) { p1 = dk4path_get_suffix(filename, erp); if (NULL != p1) { #line 189 "dk4strmr.ctr" coi = dk4str_array_index( dk4strmr_co_su, p1, DK4_HAVE_CASE_INSENSITIVE_PATHNAMES ); if (0 > coi) coi = -1; #line 193 "dk4strmr.ctr" } if (0 != dk4fopen_check(filename, 0, DK4_FOPEN_SC_IS_REGULAR, erp)) { #line 196 "dk4strmr.ctr" switch (coi) { case 1: { #if DK4_HAVE_BZLIB_H && (!(DK4_ON_WINDOWS && DK4_WIN_DENY_CRT)) #if DK4_CHAR_SIZE > 1 /* +++++ bzip2, wchar_t */ #line 202 "dk4strmr.ctr" fd = dk4fd_wc_open(filename, (DK4_O_RDONLY | DK4_O_BINARY), erp); if (-1 < fd) { bzf = BZ2_bzdopen(fd, dk4strmr_c8_mode); if (NULL != bzf) { back = dk4stream_open_for_bzfile_with_close( bzf, DK4_STREAM_READ, 4096, 1024, erp ); if (NULL == back) { BZ2_bzclose(bzf); } } else { dk4error_set_simple_error_code(erp, DK4_E_OPEN_READ_FAILED); (void)dk4fd_close(fd, NULL); } } else { dk4error_set_simple_error_code(erp, DK4_E_OPEN_READ_FAILED); } /* ----- bzip2, wchar_t */ #else /* +++++ bzip2, char */ #line 223 "dk4strmr.ctr" bzf = BZ2_bzopen(filename, dk4strmr_c8_mode); if (NULL != bzf) { back = dk4stream_open_for_bzfile_with_close( bzf, DK4_STREAM_READ, 4096, 1024, erp ); if (NULL == back) { BZ2_bzclose(bzf); } } else { dk4error_set_simple_error_code(erp, DK4_E_OPEN_READ_FAILED); } /* ----- bzip2, char */ #endif #else dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); #endif } break; case 0: case 2: { #line 241 "dk4strmr.ctr" #if DK4_HAVE_ZLIB_H && (!(DK4_ON_WINDOWS && DK4_WIN_DENY_CRT)) #if DK4_CHAR_SIZE > 1 #line 244 "dk4strmr.ctr" /* +++++ gzip, wchar_t */ fd = dk4fd_wc_open(filename, (DK4_O_RDONLY | DK4_O_BINARY), erp); if (-1 < fd) { gzf = gzdopen(fd, dk4strmr_c8_mode); if (NULL != gzf) { back = dk4stream_open_for_gzfile_with_close( gzf, DK4_STREAM_READ, 4096, 1024, erp ); if (NULL == back) { gzclose(gzf); } } else { dk4error_set_simple_error_code(erp, DK4_E_OPEN_READ_FAILED); (void)dk4fd_close(fd, NULL); } } /* ----- gzip, wchar_t */ #else #line 263 "dk4strmr.ctr" /* +++++ gzip, char */ gzf = gzopen(filename, dk4strmr_c8_mode); if (NULL != gzf) { back = dk4stream_open_for_gzfile_with_close( gzf, DK4_STREAM_READ, 4096, 1024, erp ); if (NULL == back) { gzclose(gzf); } } else { dk4error_set_simple_error_code(erp, DK4_E_OPEN_READ_FAILED); } /* ----- gzip, char */ #endif #else dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); #endif } break; default: { #line 282 "dk4strmr.ctr" #if DK4_ON_WINDOWS && DK4_WIN_DENY_CRT dwattr = FILE_ATTRIBUTE_NORMAL; dwattr |= FILE_FLAG_BACKUP_SEMANTICS; dwattr |= FILE_FLAG_SEQUENTIAL_SCAN; #if DK4_CHAR_SIZE > 1 fha = CreateFileW( filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, dwattr, NULL ); #else fha = CreateFileA( filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, dwattr, NULL ); #endif if (INVALID_HANDLE_VALUE != fha) { back = dk4stream_open_for_windows_handle_with_close( fha, DK4_STREAM_READ, 4096, 1024, erp ); if (NULL == back) { (void)CloseHandle(fha); } } else { dk4error_set_simple_error_code(erp, DK4_E_OPEN_READ_FAILED); } #else fipo = dk4fopen( filename, dk4strmr_dk_mode, DK4_FOPEN_SC_IS_REGULAR, erp ); if (NULL != fipo) { #line 312 "dk4strmr.ctr" back = dk4stream_open_for_file_with_close( fipo, DK4_STREAM_READ, 4096, 1024, erp ); if (NULL == back) { #line 316 "dk4strmr.ctr" (void)fclose(fipo); } } else { #line 319 "dk4strmr.ctr" } #endif #line 322 "dk4strmr.ctr" } break; } } else { #line 325 "dk4strmr.ctr" } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } #line 329 "dk4strmr.ctr" return back; }