/* 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: dk4strmw.ctr */ /** @file dk4strmw.c The dk4strmw module. */ #line 100 "dk4strmw.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 "dk4strmw.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 141 "dk4strmw.ctr" /** Compression suffixes. */ static const dkChar * const dk4strmw_co_su[] = { /* 0 */ dkT(".gz"), /* 1 */ dkT(".svgz"), /* 2 */ dkT(".bz2"), NULL #line 152 "dk4strmw.ctr" }; /** File mode for binary writing. */ static const char dk4strmw_c8_mode[] = { "wb" }; /** File mode for binary writing. */ static const dkChar dk4strmw_dk_mode[] = { dkT("wb") }; dk4_stream_t * dk4stream_open_file_writer(const dkChar *filename, dk4_er_t *erp) { dk4_stream_t *back = NULL; /* Function result */ dkChar *p1 = NULL; /* File name suffix */ #if DK4_HAVE_ZLIB_H && (!(DK4_ON_WINDOWS && DK4_WIN_DENY_CRT)) gzFile gzf = NULL; /* gzip compressed output file */ #endif #if DK4_HAVE_BZLIB_H && (!(DK4_ON_WINDOWS && DK4_WIN_DENY_CRT)) BZFILE *bzf = NULL; /* bzip2 compressed output file */ #endif FILE *fipo = NULL; /* Output 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 190 "dk4strmw.ctr" #if DK4_USE_ASSERT assert(NULL != filename); #endif if (NULL != filename) { p1 = dk4path_get_suffix(filename, erp); if (NULL != p1) { #line 196 "dk4strmw.ctr" coi = dk4str_array_index( dk4strmw_co_su, p1, DK4_HAVE_CASE_INSENSITIVE_PATHNAMES ); if (0 > coi) { coi = -1; } } #if TRACE_DEBUG else { #line 203 "dk4strmw.ctr" } #endif if (0 != dk4fopen_check(filename, 1, DK4_FOPEN_SC_IS_REGULAR, erp)) { switch (coi) { case 0: case 1: { #line 208 "dk4strmw.ctr" #if DK4_HAVE_ZLIB_H && (!(DK4_ON_WINDOWS && DK4_WIN_DENY_CRT)) #if DK4_CHAR_SIZE > 1 /* +++++ gzip, wchar_t */ #line 212 "dk4strmw.ctr" fd = dk4fd_wc_open( filename, (DK4_O_WRONLY | DK4_O_BINARY | DK4_O_TRUNC | DK4_O_CREAT), erp ); if (-1 < fd) { gzf = gzdopen(fd, dk4strmw_c8_mode); if (NULL != gzf) { back = dk4stream_open_for_gzfile_with_close( gzf, DK4_STREAM_WRITE, 1024, 4096, erp ); if (NULL == back) { #line 224 "dk4strmw.ctr" gzclose(gzf); } #if TRACE_DEBUG else { #line 228 "dk4strmw.ctr" } #endif } else { #line 231 "dk4strmw.ctr" dk4error_set_simple_error_code(erp, DK4_E_OPEN_WRITE_FAILED); (void)dk4fd_close(fd, NULL); } } #if TRACE_DEBUG else { #line 237 "dk4strmw.ctr" } #endif /* ----- gzip, wchar_t */ #else /* +++++ gzip, char */ #line 243 "dk4strmw.ctr" gzf = gzopen(filename, dk4strmw_c8_mode); if (NULL != gzf) { back = dk4stream_open_for_gzfile_with_close( gzf, DK4_STREAM_WRITE, 1024, 4096, erp ); if (NULL == back) { #line 249 "dk4strmw.ctr" gzclose(gzf); } #if TRACE_DEBUG else { #line 253 "dk4strmw.ctr" } #endif } else { #line 256 "dk4strmw.ctr" dk4error_set_simple_error_code(erp, DK4_E_OPEN_WRITE_FAILED); } /* ----- gzip, char */ #endif #else dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); #endif } break; case 2: { #line 265 "dk4strmw.ctr" #if DK4_HAVE_BZLIB_H && (!(DK4_ON_WINDOWS && DK4_WIN_DENY_CRT)) #if DK4_CHAR_SIZE > 1 /* +++++ bzip2, wchar_t */ #line 269 "dk4strmw.ctr" fd = dk4fd_wc_open( filename, (DK4_O_WRONLY | DK4_O_BINARY | DK4_O_TRUNC | DK4_O_CREAT), erp ); if (-1 < fd) { bzf = BZ2_bzdopen(fd, dk4strmw_c8_mode); if (NULL != bzf) { back = dk4stream_open_for_bzfile_with_close( bzf, DK4_STREAM_WRITE, 1024, 4096, erp ); if (NULL == back) { #line 281 "dk4strmw.ctr" BZ2_bzclose(bzf); } #if TRACE_DEBUG else { #line 285 "dk4strmw.ctr" } #endif } else { #line 288 "dk4strmw.ctr" dk4error_set_simple_error_code(erp, DK4_E_OPEN_WRITE_FAILED); (void)dk4fd_close(fd, NULL); } } else { #line 292 "dk4strmw.ctr" dk4error_set_simple_error_code(erp, DK4_E_OPEN_WRITE_FAILED); } /* ----- bzip2, wchar_t */ #else /* +++++ bzip2, char */ #line 298 "dk4strmw.ctr" bzf = BZ2_bzopen(filename, dk4strmw_c8_mode); if (NULL != bzf) { back = dk4stream_open_for_bzfile_with_close( bzf, DK4_STREAM_WRITE, 1024, 4096, erp ); if (NULL == back) { #line 304 "dk4strmw.ctr" BZ2_bzclose(bzf); } #if TRACE_DEBUG else { #line 308 "dk4strmw.ctr" } #endif } else { #line 311 "dk4strmw.ctr" dk4error_set_simple_error_code(erp, DK4_E_OPEN_WRITE_FAILED); } /* ----- bzip2, char */ #endif #else dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); #endif } break; default: { #line 320 "dk4strmw.ctr" #if DK4_ON_WINDOWS && DK4_WIN_DENY_CRT #line 322 "dk4strmw.ctr" dwattr = FILE_ATTRIBUTE_NORMAL; dwattr |= FILE_FLAG_BACKUP_SEMANTICS; dwattr |= FILE_FLAG_SEQUENTIAL_SCAN; #if DK4_CHAR_SIZE > 1 fha = CreateFileW( filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, dwattr, NULL ); #else fha = CreateFileA( filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, dwattr, NULL ); #endif if (INVALID_HANDLE_VALUE != fha) { back = dk4stream_open_for_windows_handle_with_close( fha, DK4_STREAM_WRITE, 1024, 4096, erp ); if (NULL == back) { #line 341 "dk4strmw.ctr" (void)CloseHandle(fha); } #if TRACE_DEBUG else { #line 345 "dk4strmw.ctr" } #endif } else { #line 348 "dk4strmw.ctr" dk4error_set_simple_error_code(erp, DK4_E_OPEN_WRITE_FAILED); } #else #line 352 "dk4strmw.ctr" fipo = dk4fopen( filename, dk4strmw_dk_mode, DK4_FOPEN_SC_IS_REGULAR, erp ); if (NULL != fipo) { back = dk4stream_open_for_file_with_close( fipo, DK4_STREAM_WRITE, 1024, 4096, erp ); if (NULL == back) { #line 360 "dk4strmw.ctr" (void)fclose(fipo); } #if TRACE_DEBUG else { #line 364 "dk4strmw.ctr" } #endif } else { #line 367 "dk4strmw.ctr" } #endif } break; } } else { #line 372 "dk4strmw.ctr" } } else { #line 374 "dk4strmw.ctr" dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } #line 377 "dk4strmw.ctr" return back; }