diff options
author | Norbert Preining <norbert@preining.info> | 2020-10-12 03:04:00 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2020-10-12 03:04:00 +0000 |
commit | 0ce40abb18ec02ec6fd6bcc5f21612c88daa7578 (patch) | |
tree | 416289fe1448873fd8ca33051f50ad85bffa8aaa /support/dktools/dk-bin2c.ctr | |
parent | fdb18507cd80dc17f5a5256153d34668b4f4e61c (diff) |
CTAN sync 202010120303
Diffstat (limited to 'support/dktools/dk-bin2c.ctr')
-rw-r--r-- | support/dktools/dk-bin2c.ctr | 1178 |
1 files changed, 0 insertions, 1178 deletions
diff --git a/support/dktools/dk-bin2c.ctr b/support/dktools/dk-bin2c.ctr deleted file mode 100644 index 2b3e622229..0000000000 --- a/support/dktools/dk-bin2c.ctr +++ /dev/null @@ -1,1178 +0,0 @@ -%% options - -copyright owner = Dirk Krause -copyright year = 2019-xxxx -SPDX-License-Identifier: BSD-3-Clause - - - -%% module - -/** @file dk-bin2c The dk-bin2c program. - See dk_bin2c_help_text for details. -*/ - - - -#include "dk4conf.h" - -#include <stdio.h> - -#if DK4_HAVE_STDLIB_H -#ifndef STDLIB_H_INCLUDED -#include <stdlib.h> -#define STDLIB_H_INCLUDED 1 -#endif -#endif - -#if DK4_HAVE_UNISTD_H -#ifndef UNISTD_H_INCLUDED -#include <unistd.h> -#define UNISTD_H_INCLUDED 1 -#endif -#endif - -#if DK4_HAVE_SYS_TYPES_H -#ifndef SYS_TYPES_H_INCLUDED -#include <sys/types.h> -#define SYS_TYPES_H_INCLUDED 1 -#endif -#endif - -#if DK4_HAVE_SIGNAL_H -#ifndef SIGNAL_H_INCLUDED -#include <signal.h> -#define SIGNAL_H_INCLUDED 1 -#endif -#endif - -#if DK4_HAVE_PROCESS_H -#ifndef PROCESS_H_INCLUDED -#include <process.h> -#define PROCESS_H_INCLUDED 1 -#endif -#endif - -#if DK4_HAVE_IO_H -#ifndef IO_H_INCLUDED -#include <io.h> -#define IO_H_INCLUDED 1 -#endif -#endif - -#if DK4_HAVE_FCNTL_H -#ifndef FCNTL_H_INCLUDED -#include <fcntl.h> -#define FCNTL_H_INCLUDED 1 -#endif -#endif - -#if DK4_HAVE_ERRNO_H -#ifndef ERRNO_H_INCLUDED -#include <errno.h> -#define ERRNO_H_INCLUDED 1 -#endif -#endif - -#include "dk4types.h" -#include "dk4const.h" -#include "dk4mem.h" -#include "dk4app.h" -#include "dk4aopt.h" -#include "dk4fopda.h" -#include "dk4fput.h" -#include "dk4vers.h" -#include "dk4mpl.h" -#include "dk4unused.h" -#include "dk4str8.h" -#include "dk4strw.h" -#include "dk4strd.h" -#include "dk4pathd.h" - -#ifndef DK4WMAIN_H_INCLUDED -#include "dk4wmain.h" -#endif - -$!trace-include - - - -/** Buffer for data from file. -*/ -static unsigned char buffer[4096]; - - - -/** Localized dkChar text fragments, overwritten by string table if found. -*/ -static const dkChar * const dk_bin2c_kw_def[] = { -$!string-table macro=dkT -# -# 0 Error: Failed to set up signal handlers! -# -Failed to set up signal handlers! -# -# 1 Error: Failed to restore signal handlers! -# -Failed to restore signal handlers! -# -# 2 Error: Path or file name too long! -# -Path or file name too long! -# -# 3 Error: Path too long! -# -Path too long! -# -# 4 Error: No matching file found! -# -No matching file found! -# -# 5 Error: Interrupted by SIGINT! -# -Interrupted by SIGINT! -# -# 6 Error: Interrupted by SIGTERM! -# -Interrupted by SIGTERM! -# -# 7 Error: Interrupted by SIGPIPE! -# -Interrupted by SIGPIPE! -# -# 8 Error: Failed to write to stdout! -# -Failed to write to stdout! -$!end -}; - - - -/** Constant text fragments, not localized. -*/ -static const dkChar * const dk_bin2c_kwnl[] = { -$!string-table macro=dkT -# -# 0 Program group name -# -dktools -# -# 1 Help text file name -# -dk-bin2c.txt -# -# 2 String table file name -# -dk-bin2c.str -# -# 3 File opening mode, read binary -# -rb -# -# 4 Windows path separator -# -\\ -# -# 5 Special file name for standard input -# -<STDIN> -# -# -# -$!end -}; - - - -/** Help text shown by --help option. -*/ -static const dkChar * const dk_bin2c_help_text[] = { -$!text macro=dkT,preprocessor - -dk-bin2c - Convert binary data to C source code - -dk-bin2c [<options>] [<file(s)>] - -Options: --o --octal Octal output (default: hexadecimal). --i <uint> --indent=<uint> Indent (spaces at start of line). --s <uint> --spaces=<uint> Spaces between items on line. --b <uint> --bytes-per-line=<uint> Number of bytes to print per line. ---help Show help text. ---manual *** SHOW FULL MANUAL. *** ---version Show version information. ---license Show license information. - -$!end -}; - - - -/** License text shown by --license option. -*/ -static const dkChar * const dk_bin2c_license_text[] = { -$!text macro=dkT,preprocessor - -This software uses code from the following projects, either directly or as -a library: - -dktools Dirk Krause's tools and libraries. - See http://sourceforge.net/p/dktools/wiki/Home/ - for more information. -#if DK4_HAVE_ZLIB_H - -zlib Data compression library. - See http://www.zlib.net/ for more information. -#endif -#if DK4_HAVE_BZLIB_H - -bzip2 Data compression program and library. - See http://www.bzip.org/ for more information. -#endif - -All the licenses below apply to the program. -Licenses for used libraries are shown as found on my Scientific Linux 6.x -computer in the /usr/share/doc directory on 2015-04-01. Check the project -homepages of the used libraries for additional information and/or updated -license terms. - - -DK tools and libraries license -============================== -Copyright (c) 2015-2019, Dirk Krause. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -SUCH DAMAGE. - -#if DK4_HAVE_ZLIB_H - - -Zlib license -============ -(C) 1995-2004 Jean-loup Gailly and Mark Adler - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - -Jean-loup Gailly Mark Adler -jloup@gzip.org madler@alumni.caltech.edu -#endif -#if DK4_HAVE_BZLIB_H - - -Bzip2 and libbzip2 library license -================================== -This program, "bzip2", the associated library "libbzip2", and all -documentation, are copyright (C) 1996-2007 Julian R Seward. All -rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - -3. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - -4. The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS -OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Julian Seward, jseward@bzip.org -bzip2/libbzip2 version 1.0.5 of 10 December 2007 -#endif - -$!end -}; - - - -/** Program options. -*/ -static const dk4_option_specification_t dk_bin2c_options[] = { - { dkT('o'), dkT("octal"), DK4_OPT_ARG_NONE }, - { dkT('i'), dkT("indent"), DK4_OPT_ARG_UNSIGNED }, - { dkT('s'), dkT("spaces"), DK4_OPT_ARG_UNSIGNED }, - { dkT('b'), dkT("bytes-per-line"), DK4_OPT_ARG_UNSIGNED }, - { dkT('v'), dkT("verbose"), DK4_OPT_ARG_NONE } -}; - - - -/** Array of localized message text fragments. -*/ -static const dkChar * const *dk_bin2c_msg = dk_bin2c_kw_def; - - - -/** Indent at beginning of lines. -*/ -static dk4_um_t indent = (dk4_um_t)0UL; - - - -/** Number of spaces between items. -*/ -static dk4_um_t spaces = (dk4_um_t)0UL; - - - -/** Number of bytes t print per line. -*/ -static dk4_um_t bpl = (dk4_um_t)15UL; - - - -/** Current position in line. -*/ -static dk4_um_t position = (dk4_um_t)0UL; - - - -/** Number of options in the options array. -*/ -static size_t const sz_dk_bin2c_options = -sizeof(dk_bin2c_options)/sizeof(dk4_option_specification_t); - - - -/** Number of elements in localized text fragments array. -*/ -static size_t dk_bin2c_sz_msg = -sizeof(dk_bin2c_kw_def)/sizeof(DK4_PCDKCHAR) - 1; - - - -/** Size of input buffer. -*/ -static size_t const sz_buffer = sizeof(buffer); - - - -/** Produce octal output instead of hexadecimal output. -*/ -static int octal = 0; - - - -/** Verbose mode, issue extra diagnostics. -*/ -static int verbose = 0; - - - -/** Exit status code returned by the program. -*/ -static int exval = EXIT_FAILURE; - - - -/** Flag: Output error occured in printf(), fputs() or fputc(). -*/ -static int output_error = 0; - - - -/** Flag: Already found data. -*/ -static int have_data = 0; - - - -/** Application structure for diagnostics. -*/ -static dk4_app_t *app = NULL; - - - -#ifdef SIGPIPE -/** Indicator: SIGPIPE signal received. -*/ -static -DK4_VOLATILE -dk4_sig_atomic_t sig_had_pipe = 0; -#endif - - - -/** Indicator: SIGINT signal received. -*/ -static -DK4_VOLATILE -dk4_sig_atomic_t sig_had_int = 0; - - - -/** Indicator: SIGTERM signal received. -*/ -static -DK4_VOLATILE -dk4_sig_atomic_t sig_had_term = 0; - - - -/** Pass a volatile pointer to an atomic integer. - This function is necessary as some compilers mis-optimize - direct access to volatile variables (at least if you believe - one of the coding standards). - @param ptr Address of atomic integer variable. - @return The unmodified pointer. -*/ -static -DK4_VOLATILE -dk4_sig_atomic_t * -sig_pass_pointer(DK4_VOLATILE dk4_sig_atomic_t *ptr) -{ - return ptr; -} - - - -#ifdef SIGPIPE -/** Handler for SIGPIPE signal. - @param signo Signal number (always SIGPIPE, ignored). -*/ -static -void -sig_handler_pipe(int DK4_ARG_UNUSED(signo) ) -{ - DK4_UNUSED_ARG(signo) - *sig_pass_pointer(&sig_had_pipe) = 1; -} -#endif - - - -/** Handler for SIGINT signal. - @param signo Signal number (always SIGINT, ignored). -*/ -static -void -sig_handler_int(int DK4_ARG_UNUSED(signo) ) -{ - DK4_UNUSED_ARG(signo) - *sig_pass_pointer(&sig_had_int) = 1; -} - - - -/** Handler for SIGTERM signal. - @param signo Signal number (always SIGTERM, ignored). -*/ -static -void -sig_handler_term(int DK4_ARG_UNUSED(signo) ) -{ - DK4_UNUSED_ARG(signo) - *sig_pass_pointer(&sig_had_term) = 1; -} - - - -/** Read value from volatile atomic type. - This function is necessary as some compilers mis-optimize - direct access to volatile variables (at least if you believe - one of the coding standards). - @param ap Pointer to volatile atomic variable. - @return Contents of the variable. -*/ -static -dk4_sig_atomic_t -sig_read_atomic(DK4_VOLATILE dk4_sig_atomic_t *ap) -{ - return (*ap); -} - - - -/** Check whether we can continue or if a signal was received. - @param check_pipe Flag: Check for occured SIGPIPE signal too. - @return 1 if the program can continue, 0 if a signal was received. -*/ -static -int -sig_can_continue( -#ifdef SIGPIPE -int check_pipe -#else -int DK4_ARG_UNUSED(check_pipe) -#endif -) -{ - int back = 1; -#ifndef SIGPIPE - DK4_UNUSED_ARG(check_pipe) -#else - if (0 != check_pipe) { - if (0 != sig_read_atomic(&sig_had_pipe)) { back = 0; } - } -#endif - if (0 != sig_read_atomic(&sig_had_int )) { back = 0; } - if (0 != sig_read_atomic(&sig_had_term)) { back = 0; } - return back; -} - - - -/** Process one file contents. - @param fipo Input file, opened for binary reading. - @param infname Name of the file to process. -*/ -static -void -dk_bin2c_process_file(FILE *fipo) -{ - char buf[32]; /* Buffer for byte representation */ - dk4_um_t iu; /* Count spaces */ - size_t rdb; /* Number of bytes read from file */ - size_t i; /* Index to traverse bytes in buffer */ - int cc = 1; /* Flag: Can continue */ - $? "+ dk_bin2c_process_file" - while ((1 == cc) && (0 != sig_can_continue(1))) { - rdb = fread(buffer, 1, sz_buffer, fipo); - if (0 < rdb) { - for (i = 0; ((i < rdb) && (0 != sig_can_continue(1))); i++) { - if (0 != have_data) { - if (EOF == fputc(',', stdout)) { - output_error = 1; - exval = EXIT_FAILURE; - } - if (position >= bpl) { - position = (dk4_um_t)0UL; - if (EOF == fputc('\n', stdout)) { - output_error = 1; - exval = EXIT_FAILURE; - } - for (iu = (dk4_um_t)0UL; iu < indent; iu++) { - if (EOF == fputc(' ', stdout)) { - output_error = 1; - exval = EXIT_FAILURE; - } - } - } - else { - for (iu = (dk4_um_t)0UL; iu < spaces; iu++) { - if (EOF == fputc(' ', stdout)) { - output_error = 1; - exval = EXIT_FAILURE; - } - } - } - } - else { - for (iu = (dk4_um_t)0UL; iu < indent; iu++) { - if (EOF == fputc(' ', stdout)) { - output_error = 1; - exval = EXIT_FAILURE; - } - } - } - if (0 != octal) { - sprintf(buf, "0%03o", (unsigned)(buffer[i])); - } - else { - sprintf(buf, "0x%02x", (unsigned)(buffer[i])); - } - if (EOF == fputs(buf, stdout)) { - output_error = 1; - exval = EXIT_FAILURE; - } - have_data = 1; - position++; - } - } - else { - cc = 0; - } - } - $? "- dk_bin2c_process_file" -} - - - -/** Run as pipe, process standard input. -*/ -static -void -dk_bin2c_process_stdin(void) -{ -#if DK4_ON_WINDOWS - int oldmode; -#endif - $? "+ dk_bin2c_process_stdin" -#if DK4_ON_WINDOWS - oldmode = _setmode(_fileno(stdin), _O_BINARY); -#endif - dk_bin2c_process_file(stdin); -#if DK4_ON_WINDOWS - _setmode(_fileno(stdin), oldmode); -#endif - $? "- dk_bin2c_process_stdin" -} - - - -/** Process one file name. - @param infname Input file name (real file name, no expansion). -*/ -static -void -dk_bin2c_process_file_name(const dkChar *infname) -{ - FILE *fipo; - dkChar const *oldsourcefile; /* Source file name */ - dk4_um_t oldsourceline; /* Source line number */ - int tests = DK4_FOPEN_SC_IS_REGULAR; - $? "+ dk_bin2c_process_file_name" - oldsourcefile = dk4app_get_log_source_file(app); - oldsourceline = dk4app_get_log_source_line(app); - dk4app_set_log_source_file(app, infname); - dk4app_set_log_source_line(app, (dk4_um_t)0UL); - fipo = dk4fopen_app(infname, dk_bin2c_kwnl[3], tests, app); - if (NULL != fipo) { - dk_bin2c_process_file(fipo); - fclose(fipo); - } - else { - exval = EXIT_FAILURE; - } - dk4app_set_log_source_file(app, oldsourcefile); - dk4app_set_log_source_line(app, oldsourceline); - $? "- dk_bin2c_process_file_name" -} - - - -#if DK4_ON_WINDOWS - -/** Expand one file name. - @param pattern Input file name pattern containing wildcards. -*/ -static -void -dk_bin2c_expand_and_process(const dkChar *pattern) -{ - dkChar buf[DK4_MAX_PATH]; /* Buffer to construct file name */ - dk4_dir_t *fne; /* File name expander */ - dkChar const *shf; /* Short file name */ - dkChar const *pth; /* Path name */ - dkChar const *oldsourcefile; /* Source file name */ - dk4_um_t oldsourceline; /* Source line number */ - size_t szbuf; /* Size of buffer */ - int cc; /* Flag: Can continue */ - int res; /* String concat result */ - int found; /* Flag: File(s) found */ - $? "+ dk_bin2c_expand_and_process" - oldsourcefile = dk4app_get_log_source_file(app); - oldsourceline = dk4app_get_log_source_line(app); - dk4app_set_log_source_file(app, pattern); - dk4app_set_log_source_line(app, (dk4_um_t)0UL); - found = 0; - szbuf = DK4_SIZEOF(buf,dkChar); - fne = dk4app_fne_open(pattern, app); - if (NULL != fne) { - cc = 1; - while ((1 == cc) && (sig_can_continue(1))) { - shf = dk4dir_next_file(fne); - if (NULL != shf) { - found = 1; - pth = dk4dir_get_path(fne); - if (NULL != pth) { - /* - Construct full file name in buf, - process this file name - */ - res = dk4str_cpy_s(buf, szbuf, pth, NULL); - if (0 != res) { - res = dk4str_cat_s(buf, szbuf, dk_bin2c_kwnl[4], NULL); - if (0 != res) { - res = dk4str_cat_s(buf, szbuf, shf, NULL); - if (0 != res) { - dk_bin2c_process_file_name(buf); - } - else { - /* ERROR: Path or file name too long */ - dk4app_log_1( - app, dk_bin2c_msg, dk_bin2c_sz_msg, - DK4_LL_ERROR, 2 - ); - exval = EXIT_FAILURE; - } - } - else { - /* ERROR: Path too long */ - exval = EXIT_FAILURE; - dk4app_log_1( - app, dk_bin2c_msg, dk_bin2c_sz_msg, - DK4_LL_ERROR, 3 - ); - } - } - else { - /* ERROR: Path too long */ - dk4app_log_1( - app, dk_bin2c_msg, dk_bin2c_sz_msg, DK4_LL_ERROR, 3 - ); - exval = EXIT_FAILURE; - } - } - else { - /* - No path specified, process short file name as is - */ - dk_bin2c_process_file_name(shf); - } - } - else { - cc = 0; - } - } - dk4dir_close(fne); - if (0 == found) { - /* ERROR: No matching file found */ - dk4app_log_1(app, dk_bin2c_msg, dk_bin2c_sz_msg, DK4_LL_ERROR, 4); - exval = EXIT_FAILURE; - } - } - else { - /* ERROR: Failed to open file name expander */ - exval = EXIT_FAILURE; - } - dk4app_set_log_source_file(app, oldsourcefile); - dk4app_set_log_source_line(app, oldsourceline); - $? "- dk_bin2c_expand_and_process" -} - -#endif - - - -/** Process one file name. - @param infname File name to process, may be a pattern with wildcards. -*/ -static -void -dk_bin2c_process_one_argv(const dkChar *infname) -{ - $? "+ dk_bin2c_process_one_argv" -#if DK4_ON_WINDOWS - if (0 != dk4path_must_expand(infname)) { - dk_bin2c_expand_and_process(infname); - } - else { -#endif - dk_bin2c_process_file_name(infname); -#if DK4_ON_WINDOWS - } -#endif - $? "- dk_bin2c_process_one_argv" -} - - - -/** Run functionality after setting up signal handlers. -*/ -static -void -dk_bin2c_normal_run(void) -{ - int argc; /* Number of command line arguments */ - int i; /* Current command line argument index */ - $? "+ dk_bin2c_normal_run" - /* - Indicate success so far - */ - exval = EXIT_SUCCESS; - /* - Process command line arguments - */ - if (0 != dk4app_opt_is_set_short(app, dkT('o'), NULL)) { - octal = 1; - } - if (0 != dk4app_opt_is_set_short(app, dkT('v'), NULL)) { - verbose = 1; - } - if (0 != dk4app_opt_is_set_short(app, dkT('i'), NULL)) { - if (0 == dk4app_opt_get_unsigned_short(&indent, app, dkT('i'), NULL)) { - indent = (dk4_um_t)0UL; - } - } - if (0 != dk4app_opt_is_set_short(app, dkT('s'), NULL)) { - if (0 == dk4app_opt_get_unsigned_short(&spaces, app, dkT('s'), NULL)) { - spaces = (dk4_um_t)0UL; - } - } - if (0 != dk4app_opt_is_set_short(app, dkT('b'), NULL)) { - if (0 == dk4app_opt_get_unsigned_short(&bpl, app, dkT('b'), NULL)) { - bpl = (dk4_um_t)15UL; - } - } - /* - Start normal processing - */ - argc = dk4app_get_argc(app); - if (0 < argc) { - /* - Process named files - */ - for (i = 0; ((i < argc) && (0 != sig_can_continue(1))); i++) { - dk_bin2c_process_one_argv(dk4app_get_argv(app, i)); - } - } - else { - /* - Process standard input - */ - dk_bin2c_process_stdin(); - } - if (0 != have_data) { - if (EOF == fputc('\n', stdout)) { - output_error = 1; - exval = EXIT_FAILURE; - } - } - $? "- dk_bin2c_normal_run" -} - - - -#if DK4_HAVE_SIGACTION -/** Set signal handlers and run. -*/ -static -void -dk_bin2c_run_with_signal_handlers(void) -{ -#ifdef SIGPIPE - struct sigaction opipe; - struct sigaction npipe; -#endif - struct sigaction oint; - struct sigaction nint; - struct sigaction oterm; - struct sigaction nterm; - int success = 0; - -#ifdef SIGPIPE - /* Set up signal handling for SIGPIPE. - */ - DK4_MEMRES(&npipe, sizeof(npipe)); - npipe.sa_handler = sig_handler_pipe; - npipe.sa_flags = 0; - if (0 != sigemptyset(&npipe.sa_mask)) { - /* ERROR: Failed to set up masked signal set for SIGPIPE */ - dk4app_log_1(app, dk_bin2c_msg, dk_bin2c_sz_msg, DK4_LL_ERROR, 0); - goto finished; - } - if (0 != sigaddset(&npipe.sa_mask, SIGPIPE)) { - /* ERROR: Failed to set up masked signal set for SIGPIPE */ - dk4app_log_1(app, dk_bin2c_msg, dk_bin2c_sz_msg, DK4_LL_ERROR, 0); - goto finished; - } - if (0 != sigaction(SIGPIPE, &npipe, &opipe)) { - /* ERROR: Failed to set up signal handler for SIGPIPE */ - dk4app_log_1(app, dk_bin2c_msg, dk_bin2c_sz_msg, DK4_LL_ERROR, 0); - goto finished; - } -#endif - - /* Set up signal handling for SIGINT. - */ - DK4_MEMRES(&nint, sizeof(nint)); - nint.sa_handler = sig_handler_int; - nint.sa_flags = 0; - if (0 != sigemptyset(&nint.sa_mask)) { - /* ERROR: Failed to set up masked signal set for SIGINT */ - dk4app_log_1(app, dk_bin2c_msg, dk_bin2c_sz_msg, DK4_LL_ERROR, 0); - goto restore_old_pipe; - } - if (0 != sigaddset(&nint.sa_mask, SIGINT)) { - /* ERROR: Failed to set up masked signal set for SIGINT */ - dk4app_log_1(app, dk_bin2c_msg, dk_bin2c_sz_msg, DK4_LL_ERROR, 0); - goto restore_old_pipe; - } - if (0 != sigaction(SIGINT, &nint, &oint)) { - /* ERROR: Failed to set up signal handler for SIGINT */ - dk4app_log_1(app, dk_bin2c_msg, dk_bin2c_sz_msg, DK4_LL_ERROR, 0); - goto restore_old_pipe; - } - - /* Set up signal handling for SIGTERM - */ - DK4_MEMRES(&nterm, sizeof(nterm)); - nterm.sa_handler = sig_handler_term; - nterm.sa_flags = 0; - if (0 != sigemptyset(&nterm.sa_mask)) { - /* ERROR: Failed to set up masked signal set for SIGTERM */ - dk4app_log_1(app, dk_bin2c_msg, dk_bin2c_sz_msg, DK4_LL_ERROR, 0); - goto restore_old_int; - } - if (0 != sigaddset(&nterm.sa_mask, SIGTERM)) { - /* ERROR: Failed to set up masked signal set for SIGTERM */ - dk4app_log_1(app, dk_bin2c_msg, dk_bin2c_sz_msg, DK4_LL_ERROR, 0); - goto restore_old_int; - } - if (0 != sigaction(SIGTERM, &nterm, &oterm)) { - /* ERROR: Failed to set up signal handler for SIGTERM */ - dk4app_log_1(app, dk_bin2c_msg, dk_bin2c_sz_msg, DK4_LL_ERROR, 0); - goto restore_old_int; - } - - success = 1; - dk_bin2c_normal_run(); - - /* Restore signal handling for SIGTERM. - */ - if (0 != sigaction(SIGTERM, &oterm, NULL)) { - /* ERROR: Failed to restore old SIGTERM settings */ - dk4app_log_1(app, dk_bin2c_msg, dk_bin2c_sz_msg, DK4_LL_ERROR, 1); - success = 0; - } - - /* Restore signal handling for SIGINT. - */ - restore_old_int: - if (0 != sigaction(SIGINT, &oint, NULL)) { - /* ERROR: Failed to restore old SIGINT settings */ - dk4app_log_1(app, dk_bin2c_msg, dk_bin2c_sz_msg, DK4_LL_ERROR, 1); - success = 0; - } - -#ifdef SIGPIPE - /* Restore signal handling for SIGPIPE. - */ - restore_old_pipe: - if (0 != sigaction(SIGPIPE, &opipe, NULL)) { - /* ERROR: Failed to restore old SIGPIPE settings */ - dk4app_log_1(app, dk_bin2c_msg, dk_bin2c_sz_msg, DK4_LL_ERROR, 1); - success = 0; - } -#endif - - /* Set exit status code if error occured. - */ - finished: - if (0 == success) { exval = EXIT_FAILURE; } -} -#else -#if DK4_HAVE_SIGSET -/** Set signal handlers and run. -*/ -static -void -dk_bin2c_run_with_signal_handlers(void) -{ -#ifdef SIGPIPE - dk4_sig_handler_t *oldpipe = NULL; -#endif - dk4_sig_handler_t *oldint = NULL; - dk4_sig_handler_t *oldterm = NULL; - -#ifdef SIGPIPE - oldpipe = sigset(SIGPIPE, sig_handler_pipe); -#endif - oldint = sigset(SIGINT, sig_handler_int); - oldterm = sigset(SIGTERM, sig_handler_term); - dk_bin2c_normal_run(); - sigset(SIGTERM, oldterm); - sigset(SIGINT, oldint); -#ifdef SIGPIPE - sigset(SIGPIPE, oldpipe); -#endif -} -#else -#if DK4_HAVE_SIGNAL -/** Set signal handlers and run. -*/ -static -void -dk_bin2c_run_with_signal_handlers(void) -{ -#ifdef SIGPIPE - dk4_sig_handler_t *oldpipe = NULL; -#endif - dk4_sig_handler_t *oldint = NULL; - dk4_sig_handler_t *oldterm = NULL; - -#ifdef SIGPIPE - oldpipe = signal(SIGPIPE, sig_handler_pipe); -#endif - oldint = signal(SIGINT, sig_handler_int); - oldterm = signal(SIGTERM, sig_handler_term); - dk_bin2c_normal_run(); - signal(SIGTERM, oldterm); - signal(SIGINT, oldint); -#ifdef SIGPIPE - signal(SIGPIPE, oldpipe); -#endif -} -#else -/** Set signal handlers and run. -*/ -static -void -dk_bin2c_run_with_signal_handlers(void) -{ - dk_bin2c_normal_run(); -} -#endif -#endif -#endif - - - -/** Main function. - @param argc Number of command line arguments. - @param argv Command line arguments array. - @return 0 on success, all other values indicate errors. -*/ -#if DK4_CHAR_SIZE > 1 -int wmain(int argc, wchar_t *argv[]) -#else -int main(int argc, char *argv[]) -#endif -{ - int silent = 0; /* Flag: Run silently in vim */ - int shp = 0; /* Flag: SIGPIPE occured */ - $!trace-init dk-bin2c.deb - $? "+ main" - /* - Check for running within vim - */ -#if DK4_CHAR_SIZE > 1 - if (NULL != getenv("VIM")) { silent = 1; } - if (NULL != getenv("VIMRUNTIME")) { silent = 1; } -#endif - /* - Open application - */ - if (0 != silent) { - app = dk4app_open_silent( - argc, argv, dk_bin2c_options, sz_dk_bin2c_options, - dk_bin2c_kwnl[0], DKT_VERSION_DK, - dk_bin2c_kwnl[1], dk_bin2c_help_text, dk_bin2c_license_text - ); - } - else { - dk4fput_initialize_stderr(); - app = dk4app_open_cmd( - argc, argv, dk_bin2c_options, sz_dk_bin2c_options, - dk_bin2c_kwnl[0], DKT_VERSION_DK, - dk_bin2c_kwnl[1], dk_bin2c_help_text, dk_bin2c_license_text - ); - } - if (NULL != app) { - dk_bin2c_sz_msg = dk4app_string_table_size(dk_bin2c_kw_def); - dk_bin2c_msg = dk4app_string_table( - app, dk_bin2c_kwnl[2], dk_bin2c_kw_def - ); - if (0 != dk4app_can_run_normally(app)) { - dk_bin2c_run_with_signal_handlers(); - } - else { - dk4fput_initialize_stdout(); - if (0 != dk4app_help_version_license(app)) { - exval = EXIT_SUCCESS; - } - fflush(stdout); - fflush(stderr); - dk4fput_cleanup_stdout(); - } - if (0 != sig_read_atomic(&sig_had_int )) { - exval = EXIT_FAILURE; - /* ERROR: Interrupted by SIGINT */ - dk4app_log_1(app, dk_bin2c_msg, dk_bin2c_sz_msg, DK4_LL_ERROR, 5); - } - if (0 != sig_read_atomic(&sig_had_term)) { - exval = EXIT_FAILURE; - /* ERROR: Interrupted by SIGTERM */ - dk4app_log_1(app, dk_bin2c_msg, dk_bin2c_sz_msg, DK4_LL_ERROR, 6); - } -#ifdef SIGPIPE - if (0 != sig_read_atomic(&sig_had_pipe)) { - exval = EXIT_FAILURE; - shp = 1; - if (0 != verbose) { - /* ERROR: Interrupted by SIGPIPE */ - dk4app_log_1(app,dk_bin2c_msg,dk_bin2c_sz_msg,DK4_LL_ERROR,7); - } - } -#endif - if ((0 == shp) && (0 != output_error)) { - exval = EXIT_FAILURE; - /* ERROR: Output to stdout failed */ - dk4app_log_1(app, dk_bin2c_msg, dk_bin2c_sz_msg, DK4_LL_ERROR, 8); - } - dk4app_close(app); - } - else { - } - if (0 != have_data) { - fflush(stdout); - } - if (0 == silent) { - fflush(stderr); - dk4fput_cleanup_stderr(); - } - $? "- main %d", exval - $!trace-end - exit(exval); return exval; -} - - -/* vim: set ai sw=4 ts=4 : */ - |