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-t2l.ctr | |
parent | fdb18507cd80dc17f5a5256153d34668b4f4e61c (diff) |
CTAN sync 202010120303
Diffstat (limited to 'support/dktools/dk-t2l.ctr')
-rw-r--r-- | support/dktools/dk-t2l.ctr | 2042 |
1 files changed, 0 insertions, 2042 deletions
diff --git a/support/dktools/dk-t2l.ctr b/support/dktools/dk-t2l.ctr deleted file mode 100644 index e240ba59ab..0000000000 --- a/support/dktools/dk-t2l.ctr +++ /dev/null @@ -1,2042 +0,0 @@ -%% options - -copyright owner = Dirk Krause -copyright year = 2015-xxxx -SPDX-License-Identifier: BSD-3-Clause - - -%% module - -/** @file dk-th2.c The dk-t2l program. - See dk_t2l_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 "dk4enc.h" -#include "dk4app.h" -#include "dk4aopt.h" -#include "dk4fopda.h" -#include "dk4fput.h" -#include "dk4vers.h" -#include "dk4tsp32.h" -#include "dk4uc2l.h" -#include "dk4uc2la.h" -#include "dk4maidhdu.h" -#include "dk4maidddu.h" -#include "dk4maodh.h" -#include "dk4maodd.h" -#include "dk4mpl.h" -#include "dk4strd.h" -#include "dk4pathd.h" -#include "dk4strm.h" -#include "dk4strmf.h" -#include "dk4strmo32.h" - - - -#if DK4_CHAR_SIZE > 1 -#if DK4_CHAR_SIZE == 2 -#include "dk4utf16.h" -#endif -#else -#include "dk4ansi.h" -#include "dk4utf8.h" -#endif -#include "dk4unused.h" - -#ifndef DK4WMAIN_H_INCLUDED -#include "dk4wmain.h" -#endif - - -$!trace-include - - - -/** Default help text, shown if no help text file is found. -*/ -static const dkChar * const dk_t2l_help_text[] = { -$!text macro=dkT,preprocessor - -dk-t2l - Text to LaTeX converter - -dk-t2l [<options>] [<file(s)>] - -Options: --i <encoding> --input-encoding=<encoding> Expected input encoding. --e --echo Process command line arguments. --n --numeric Numeric values on command line. --h --hex Hexadecimal values on cmd line. --r --recommendations Write recommendations for - packages and font encodings - to use. --l --line-feed Write \\ sequence for newline. --t --tabulator Write LaTeX sequence for - tabulators - --verbose Show error message on SIGPIPE. - --check Syntax check for all data files. - ---help Show this short help text. ---manual *** SHOW FULL MANUAL. *** ---version Show version information. ---license Show license information. - -http://sourceforge.net/p/dktools/wiki/dk-t2l/ - -$!end -}; - - - -/** License text. -*/ -static const dkChar * const dk_t2l_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-2016, 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 -}; - - - -/** Constant 8 bit character texts, not localized. -*/ -static const char * const dk_t2l_kw8[] = { -$!string-table -# -# 0 1 Open and close math mode. -# -\\( -\\) -# -# 2 -# -\\\\ -$!end -}; - - - -/** Constant text keywords used by the program, not localized. -*/ -static const dkChar * const dk_t2l_kwnl[] = { -$!string-table macro=dkT -# -# 0 Program group name -# -dktools -# -# 1 Help text file name -# -dk-t2l.txt -# -# 2 String table file name -# -dk-t2l.str -# -# 3 File opening mode, read binary -# -rb -# -# 4 Pseudo file name for standard input -# -stdin -# -# 5 Path separator for Windows -# -\\ -# -# 6 Long option for verbose mode -# -verbose -# -# 7 Long option for syntax check -# -check -$!end -}; - - - -/** Constant keywords used by the program, replaced by localized texts. -*/ -static const dkChar * const dk_t2l_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 3 Error: Illegal input encoding name: "..."! -# -Illegal input encoding name: " -"! -# -# 4 5 Temporarily unused. -# -Not a hexadecimal number: " -"! -# -# 6 7 8 Error: No data found for character 0x...! -# -No data found for character 0x -! -No data found for character! -# -# 9 Error: Overflow in line number count! -# -Overflow in line number count! -# -# 10 Error: Failed to setup character by character processing! -# -Failed to setup character by character processing! -# -# 11 Error: Probably incorrect output due to problems ... -# -Probably incorrect output due to problems with the data files! -# -# 12 .. 15 Error: Aborted by SIGINT signal! -# -Aborted by SIGINT signal! -Aborted by SIGTERM signal! -Received SIGPIPE signal! -Write attempt to standard output failed. -# -# 16 ... 21 Error messages. -# -Decoding failed!\n\tByte: -Encoding failed!\n\tByte: -Processing failed!\n\tByte: -,\n\tCharacter: -,\n\tPosition in line: -. -# -# 22 ... 27 Error messages. -# -Decoding failed! -Encoding failed! -Processing failed! -Further decoding failures! -Further encoding failures! -Further processing failures! -# -# 28 29 Error: Out of range! -# -Out of range: " -"! -# -# 30 31 Error: Not a decimal number! -# -Not a decimal number: " -"! -$!end -}; - - - -/** Options for the program. -*/ -static const dk4_option_specification_t dk_t2l_options[] = { - - /* Expected input encoding. - */ - { dkT('i'), dkT("input-encoding"), DK4_OPT_ARG_STRING }, - - /* Process command line arguments. - */ - { dkT('e'), dkT("echo"), DK4_OPT_ARG_NONE }, - - /* Command line arguments are decimal character numbers. - */ - { dkT('n'), dkT("numeric"), DK4_OPT_ARG_NONE }, - - /* Command line arguments are hexadecimal character numbers. - */ - { dkT('h'), dkT("hex"), DK4_OPT_ARG_NONE }, - - /* Write recommendations about font encodings and packages. - */ - { dkT('r'), dkT("recommendations"), DK4_OPT_ARG_NONE }, - - /* Convert tabulators. - */ - { dkT('t'), dkT("tabulator"), DK4_OPT_ARG_NONE }, - - /* Convert line feeds. - */ - { dkT('l'), dkT("line-feed"), DK4_OPT_ARG_NONE }, - - /* Verbose output. - */ - { dkT('\0'), dkT("verbose"), DK4_OPT_ARG_NONE }, - - /* Immediately load all data files for syntax check. - */ - { dkT('\0'), dkT("check"), DK4_OPT_ARG_NONE } -}; - - - -/** Pointer to localized or not localized texts. -*/ -static const dkChar * const *dk_t2l_msg = dk_t2l_kw_def; - - - -/** Application structure. -*/ -static dk4_app_t *app = NULL; - - - -/** Conversion data structure. -*/ -static dk4_uc2l_t *uc2l = NULL; - - - -/** Current line number. -*/ -static dk4_um_t dk_t2l_lineno = (dk4_um_t)1UL; - - - -/** Number of elements in the dk_t2l_options array. -*/ -static const size_t dk_t2l_sz_options = -sizeof(dk_t2l_options)/sizeof(dk4_option_specification_t); - - - -/** Number of elements in dk_t2l_msg array. -*/ -static size_t dk_t2l_sz_msg = -sizeof(dk_t2l_kw_def)/sizeof(DK4_PCDKCHAR) - 1; - - -/** Program exit status. -*/ -static int exval = EXIT_FAILURE; - - - -/** Flag: Error occured while writing to stdout. -*/ -static int output_error = 0; - - - -/** Flag: Verbose output (report SIGPIPE). -*/ -static int verbose = 0; - - - -/** Flag: Echo command line arguments instead of processing files. -*/ -static int dk_t2l_echo = 0; - - - -/** Command line arguments are numeric: - 0 = text, - 1 = decimal, - 2 = hexadecimal. -*/ -static int dk_t2l_numeric = 0; - - - -/** Input encoding expected when processing stdin. -*/ -static int dk_t2l_i_std = -#if DK4_ON_WINDOWS - DK4_FILE_ENCODING_WIN1252 -#else - DK4_FILE_ENCODING_PLAIN -#endif -; - - - -/** Input encoding expected when processing files. -*/ -static int dk_t2l_i_file = -#if DK4_ON_WINDOWS - DK4_FILE_ENCODING_WIN1252 -#else - DK4_FILE_ENCODING_PLAIN -#endif -; - - - -/** Number of decoding errors in current file. -*/ -static int dk_t2l_dec_err = 0; - - - -/** Number of encoding errors in current file. -*/ -static int dk_t2l_enc_err = 0; - - - -/** Number of processing errors in current file. -*/ -static int dk_t2l_pro_err = 0; - - - -/** Flag: Previous character was carriage return. -*/ -static int dk_t2l_last_cr = 0; - - - -/** Flag: Previous character was newline. -*/ -static int dk_t2l_last_nl = 0; - - - -/** Flag: Have text in line, newline needed. -*/ -static int dk_t2l_lhtx = 0; - - - -/** Flag: In math mode. -*/ -static int dk_t2l_in_mm = 0; - - - -/** Flag: Find LaTeX sequence also for tabulators. -*/ -static int dk_t2l_tabs = 0; - - - -/** Flag: Write sequence for line feeds. -*/ -static int dk_t2l_linef = 0; - - -/** Flag: Syntax check on all data files. -*/ -static int dk_t2l_synchk = 0; - - - -#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; -} - - - -/** Check whether we can continue. - @return 1 for yes, 0 for no. -*/ -static -int -dk_t2l_can_continue(void) -{ - int back = 1; - if (0 == sig_can_continue(1)) { - back = 0; - } - return back; -} - - - -/** Process command line options. - @return 1 on success, 0 on error. -*/ -static -int -dk_t2l_process_options(void) -{ - const dkChar *oaptr; - int encval = 0; - int bomval = 0; - int back = 1; - - if (0 != dk4app_opt_is_set_long(app, dk_t2l_kwnl[6], NULL)) { - verbose = 1; - } - if (0 != dk4app_opt_is_set_short(app, dkT('t'), NULL)) { - dk_t2l_tabs = 1; - } - if (0 != dk4app_opt_is_set_short(app, dkT('l'), NULL)) { - dk_t2l_linef = 1; - } - if (0 != dk4app_opt_is_set_short(app, dkT('i'), NULL)) { - oaptr = dk4app_opt_get_string_ptr_short(app, dkT('i'), NULL); - if (NULL != oaptr) { - if (0 != dk4enc_find(&encval, &bomval, oaptr, NULL)) { - dk_t2l_i_std = dk_t2l_i_file = encval; - } else { - /* ERROR: Illegal encoding */ - dk4app_log_3(app, dk_t2l_msg, dk_t2l_sz_msg, DK4_LL_ERROR, 2, 3, oaptr); - back = 0; - } - } else { $? "! bug" - /* ERROR: Failed to obtain option argument, bug! */ - } - } - if (0 != dk4app_opt_is_set_short(app, dkT('e'), NULL)) { - dk_t2l_echo = 1; - } - if (0 != dk4app_opt_is_set_short(app, dkT('n'), NULL)) { - dk_t2l_echo = 1; - dk_t2l_numeric = 1; - } - if (0 != dk4app_opt_is_set_short(app, dkT('h'), NULL)) { - dk_t2l_echo = 1; - dk_t2l_numeric = 2; - } - if (0 != dk4app_opt_is_set_long(app, dk_t2l_kwnl[7], NULL)) { - dk_t2l_synchk = 1; - } - uc2l = dk4uc2l_open_from_app_ex1(app, dk_t2l_synchk); - if (NULL == uc2l) { - back = 0; - } - return back; -} - - - -/** Start output page. -*/ -static -void -dk_t2l_output_start_page(void) -{ - /* Hook */ -} - - - -/** Finish output page. -*/ -static -void -dk_t2l_output_finish_page(void) -{ - /* Hook */ -} - - - -/** Start processing of one file. -*/ -static -void -dk_t2l_output_start_file(void) -{ - /* No errors in this file yet. - */ - dk_t2l_dec_err = 0; - dk_t2l_enc_err = 0; - dk_t2l_pro_err = 0; - dk_t2l_last_cr = 0; - dk_t2l_last_nl = 0; - dk_t2l_lhtx = 0; - dk_t2l_lineno = (dk4_um_t)1UL; - dk4app_set_log_source_line(app, dk_t2l_lineno); -} - - - -/** Finish processing of one file. -*/ -static -void -dk_t2l_output_finish_file(void) -{ - -} - - - -static -void -dk_t2l_begin_math_mode(void) -{ - if (0 == dk_t2l_in_mm) { - dk_t2l_in_mm = 1; - if (EOF == fputs(dk_t2l_kw8[0], stdout)) { - output_error = 1; - } - } -} - - - -static -void -dk_t2l_end_math_mode(void) -{ - if (0 != dk_t2l_in_mm) { - dk_t2l_in_mm = 0; - if (EOF == fputs(dk_t2l_kw8[1], stdout)) { - output_error = 1; - } - } -} - - - -/** Handler function after processing CR/NL sequences. - Here we do the real output. - @param c Character to process. - @param pos Current position in file or data stream, may be NULL. - @param erp Error report, may be NULL. - @return Result code: - - DK4_TSP_RES_OK if the character was processed successfully, - - DK4_TSP_RES_ERROR if there was an error but we can continue, - - DK4_TSP_RES_FATAL if there was a fatal error so we - should abort processing. -*/ -static -int -dk_t2l_c32_after_cr_nl_check( - dk4_c32_t c -) -{ - dkChar buf[16*sizeof(dk4_um_t)]; - const char *lseq; - size_t szbuf; - int back = DK4_TSP_RES_OK; - - if (dkC32(0x0A) == c) { - /* - Newline, finish line and write newline to output. - */ - dk_t2l_end_math_mode(); - if (0 != dk_t2l_linef) { - if (EOF == fputs(dk_t2l_kw8[2], stdout)) { output_error = 1; } - } - if (EOF == fputc('\n', stdout)) { output_error = 1; } - } else { - if (0 == dk_t2l_lhtx) { - /* - Start new line. - */ - } - /* - Write character to output. - */ - if ((dkC32(0x09) == c) && (0 == dk_t2l_tabs)) { - dk_t2l_end_math_mode(); - if (EOF == fputc(' ', stdout)) { output_error = 1; } - } else { - lseq = dk4uc2l_find_app(uc2l, c, 0, app); - if (NULL != lseq) { - dk_t2l_end_math_mode(); - if (EOF == fputs(lseq, stdout)) { output_error = 1; } - } else { - lseq = dk4uc2l_find_app(uc2l, c, 1, app); - if (NULL != lseq) { - dk_t2l_begin_math_mode(); - if (EOF == fputs(lseq, stdout)) { output_error = 1; } - } else { - /* ERROR, no encoding found */ - szbuf = DK4_SIZEOF(buf,dkChar); - if (0 != dk4ma_write_hex_unsigned(buf, szbuf, (dk4_um_t)c, 8, NULL)) { - dk4app_log_3(app,dk_t2l_msg,dk_t2l_sz_msg,DK4_LL_ERROR,6,7,buf); - } else { - dk4app_log_1(app, dk_t2l_msg, dk_t2l_sz_msg, DK4_LL_ERROR, 8); - } - exval = EXIT_FAILURE; - } - } - } - } - return back; -} - - - -/** Handler function for single characters. - @param obj Object to modify while processing the character. - @param c Character to process. - @param pos Current position in file or data stream. - @param erp Error report, may be NULL. - @return Result code: - - DK4_TSP_RES_OK if the character was processed successfully, - - DK4_TSP_RES_ERROR if there was an error but we can continue, - - DK4_TSP_RES_FATAL if there was a fatal error so we - should abort processing. -*/ -static -int -dk_t2l_c32_handler( - void * DK4_ARG_UNUSED(obj), - dk4_c32_t c, - dk4_text_stream_position_t * DK4_ARG_UNUSED(pos), - dk4_er_t * DK4_ARG_UNUSED(erp) -) -{ - int back = DK4_TSP_RES_OK; - DK4_UNUSED_ARG(obj) - DK4_UNUSED_ARG(pos) - DK4_UNUSED_ARG(erp) - if (dkC32(0x0A) == c) { - /* - For a newline clear CR and TXT flag, set NL flag. - */ - back = dk_t2l_c32_after_cr_nl_check(c); - dk_t2l_lineno++; - if ((dk4_um_t)0UL == dk_t2l_lineno) { - /* ERROR: Overflow in line number counting */ - dk4app_log_1(app, dk_t2l_msg, dk_t2l_sz_msg, DK4_LL_ERROR, 9); - exval = EXIT_FAILURE; - } - dk4app_set_log_source_line(app, dk_t2l_lineno); - dk_t2l_last_cr = 0; - dk_t2l_last_nl = 1; - dk_t2l_lhtx = 0; - } else { - if (dkC32(0x0D) == c) { - /* - For a cr if CR flag is set, pass the cr and set TXT flag, clear nl flag. - Otherwise simply set CR flag. - */ - if (0 != dk_t2l_last_cr) { - back = dk_t2l_c32_after_cr_nl_check(dkC32(0x0D)); - dk_t2l_lhtx = 1; - dk_t2l_last_nl = 0; - } else { - dk_t2l_last_cr = 1; - } - } else { - /* - For any other character: - If the CR flag is set, pass cr and current character. - Otherwise pass the current character. - Reset NL and CR flag, set TXT flag. - */ - if (0 != dk_t2l_last_cr) { - back = dk_t2l_c32_after_cr_nl_check(dkC32(0x0D)); - switch (dk_t2l_c32_after_cr_nl_check(c)) { - case DK4_TSP_RES_FATAL: { - back = DK4_TSP_RES_FATAL; - } break; - case DK4_TSP_RES_ERROR: { - if (DK4_TSP_RES_OK == back) { - back = DK4_TSP_RES_ERROR; - } - } break; - } - } else { - back = dk_t2l_c32_after_cr_nl_check(c); - } - dk_t2l_lhtx = 1; - dk_t2l_last_nl = 0; - dk_t2l_last_cr = 0; - } - } - return back; -} - - - -/** Report an error with position in source line. - @param i1 Index of first message part in array. - @param i2 Index of alternative first message part. - @param bno Byte processed. - @param lno Current line number. - @param cno Current character number. - @param cil Current character number in line. -*/ -static -void -dk_t2l_report_with_position( - size_t i1, - size_t i2, - dk4_um_t bno, - dk4_um_t lno, - dk4_um_t cno, - dk4_um_t cil -) -{ - dkChar b1[8*(1+sizeof(dk4_um_t))]; - dkChar b2[8*(1+sizeof(dk4_um_t))]; - dkChar b3[8*(1+sizeof(dk4_um_t))]; - dk4_um_t oldlogline = (dk4_um_t)0UL; - int allbuffersok = 0; - - oldlogline = dk4app_get_log_source_line(app); - dk4app_set_log_source_line(app, lno); - if (0 != dk4ma_write_decimal_unsigned(b3,DK4_SIZEOF(b3,dkChar),cil,0,NULL)) { - if (0 != dk4ma_write_decimal_unsigned(b2,DK4_SIZEOF(b2,dkChar),cno,0,NULL)) { - if (0 != dk4ma_write_decimal_unsigned(b1,DK4_SIZEOF(b1,dkChar),bno,0,NULL)) { - allbuffersok = 1; - } - } - } - if (0 != allbuffersok) { - dk4app_log_7( - app, dk_t2l_msg, dk_t2l_sz_msg, DK4_LL_ERROR, i1, 19, 20, 21, b1, b2, b3 - ); - } else { - dk4app_log_1( - app, dk_t2l_msg, dk_t2l_sz_msg, DK4_LL_ERROR, i2 - ); - } - dk4app_set_log_source_line(app, oldlogline); -} - - - -static -void -dk_t2l_report_errors(dk4_er_t *er_en, dk4_er_t *er_pr) -{ - if (NULL != er_en) { - switch (er_en->ec) { - case DK4_E_DECODING_FAILED: { - switch (dk_t2l_dec_err) { - case 0: case 1: { - dk_t2l_report_with_position( - 16, 22, - er_en->dt.fpos.byteno, - er_en->dt.fpos.lineno, - er_en->dt.fpos.charno, - er_en->dt.fpos.charinline - ); - } break; - case 2: { - dk4app_log_1( - app, dk_t2l_msg, dk_t2l_sz_msg, DK4_LL_ERROR, 25 - ); - } break; - } - if (3 > dk_t2l_dec_err) { dk_t2l_dec_err++; } - } break; - case DK4_E_ENCODING_FAILED: { - switch (dk_t2l_enc_err) { - case 0: case 1: { - dk_t2l_report_with_position( - 17, 23, - er_en->dt.fpos.byteno, - er_en->dt.fpos.lineno, - er_en->dt.fpos.charno, - er_en->dt.fpos.charinline - ); - } break; - case 2: { - dk4app_log_1( - app, dk_t2l_msg, dk_t2l_sz_msg, DK4_LL_ERROR, 26 - ); - } break; - } - if (3 > dk_t2l_enc_err) { dk_t2l_enc_err++; } - } break; - } - } - if (NULL != er_pr) { - if (DK4_E_NONE != er_pr->ec) { - switch (dk_t2l_pro_err) { - case 0: case 1: { - dk_t2l_report_with_position( - 18, 24, - er_pr->dt.fpos.byteno, - er_pr->dt.fpos.lineno, - er_pr->dt.fpos.charno, - er_pr->dt.fpos.charinline - ); - } break; - case 2: { - dk4app_log_1( - app, dk_t2l_msg, dk_t2l_sz_msg, DK4_LL_ERROR, 27 - ); - } break; - } - if (3 > dk_t2l_pro_err) { dk_t2l_pro_err++; } - } - } -} - - - -static -void -dk_t2l_echo_hex(const dkChar *txt) -{ - const dkChar *endptr = NULL; - dk4_um_t um = (dk4_um_t)0UL; - int res = 0; - if (dkT('0') == txt[0]) { - if ((dkT('x') == txt[1]) || (dkT('X') == txt[1])) { - txt++; txt++; - } - } - res = dk4ma_input_dk_hex_dk4_um_t( - &um, txt, &endptr, 1, NULL - ); - if (0 != res) { - if ((dk4_um_t)0xFFFFFFFFUL >= um) { - (void)dk_t2l_c32_after_cr_nl_check((dk4_c32_t)um); - } else { - dk4app_log_3(app, dk_t2l_msg, dk_t2l_sz_msg, DK4_LL_ERROR, 28, 29, txt); - } - } else { - /* ERROR: Not a hexadecimal number */ - dk4app_log_3(app, dk_t2l_msg, dk_t2l_sz_msg, DK4_LL_ERROR, 4, 5, txt); - } -} - - - -static -void -dk_t2l_echo_numeric(const dkChar *txt) -{ - const dkChar *endptr = NULL; - dk4_um_t um = (dk4_um_t)0UL; - int res = 0; - int ishex = 0; - - if (dkT('0') == txt[0]) { - if ((dkT('x') == txt[1]) || (dkT('X') == txt[1])) { - ishex = 1; - } - } - if (0 == ishex) { - res = dk4ma_input_dk_dec_dk4_um_t( - &um, txt, &endptr, 1, NULL - ); - if (0 != res) { - if ((dk4_um_t)0xFFFFFFFFUL >= um) { - (void)dk_t2l_c32_after_cr_nl_check((dk4_c32_t)um); - } else { - dk4app_log_3(app, dk_t2l_msg, dk_t2l_sz_msg, DK4_LL_ERROR, 28, 29, txt); - } - } else { - /* ERROR: Not a decimal number */ - dk4app_log_3(app, dk_t2l_msg, dk_t2l_sz_msg, DK4_LL_ERROR, 30, 31, txt); - } - } else { - dk_t2l_echo_hex(&(txt[2])); - } -} - - -#if DK4_CHAR_SIZE > 1 -#if DK4_CHAR_SIZE > 2 - -/** Process one text word from command line, UNICODE character. - @param txt Text word. - @param argno Number of current word. -*/ -static -void -dk_t2l_echo_c32(const dkChar *txt, int argno) -{ - int isfirst = 1; - while (dkC32(0) != *txt) { - if ((1 == isfirst) && (0 != argno)) { - if (EOF == fputc(' ', stdout)) { output_error = 1; } - } - isfirst = 0; - (void)dk_t2l_c32_after_cr_nl_check(*(txt++)); - } -} - -#else - -/** Process one text word from command line, UTF-16 encoded. - @param txt Text word. - @param argno Number of current word. -*/ -static -void -dk_t2l_echo_utf16(const dkChar *txt, int argno) -{ - dk4_utf16_decoder_t dec; - int cc = 1; - int isfirst = 1; - dk4utf16_init(&dec); - while (1 == cc) { - if (dkC16(0) != *txt) { - switch (dk4utf16_add(&dec, *(txt++))) { - case DK4_EDSTM_ERROR : { - cc = -1; - /* !!!!! ERROR: Decoding */ - exval = EXIT_FAILURE; - } break; - case DK4_EDSTM_FINISHED : { - if ((1 == isfirst) && (0 != argno)) { - if (EOF == fputc(' ', stdout)) { output_error = 1; } - } - isfirst = 0; - (void)dk_t2l_c32_after_cr_nl_check(dk4utf16_get(&dec)); - } break; - } - } else { - cc = 0; - } - } - if (0 == cc) { - if (0 == dk4utf16_is_empty(&dec)) { - /* !!!!! ERROR: Decoding */ - exval = EXIT_FAILURE; - } - } - /* !!!!! TODO: Implementation */ -} - -#endif -#else - -/** Process one text word from command line, ASCII encoded. - @param txt Text word. - @param argno Number of current word. -*/ -static -void -dk_t2l_echo_ascii(const dkChar *txt, int argno) -{ - dk4_c32_t c32; - int isfirst = 1; - while ('\0' != *txt) { - if ((1 == isfirst) && (0 != argno)) { - if (EOF == fputc(' ', stdout)) { output_error = 1; } - } - isfirst = 0; - c32 = dkC32(0xFF) & ((dk4_c32_t)((unsigned char)(*(txt++)))); - (void)dk_t2l_c32_after_cr_nl_check(c32); - } -} - -/** Process one text word from command line, UTF-8 encoded. - @param txt Text word. - @param argno Number of current word. -*/ -static -void -dk_t2l_echo_utf8(const dkChar *txt, int argno) -{ - dk4_utf8_decoder_t dec; - int cc = 1; - int isfirst = 1; - - dk4utf8_init(&dec); - while (1 == cc) { - if ('\0' != *txt) { - switch (dk4utf8_add(&dec, *(txt++))) { - case DK4_EDSTM_ERROR : { - cc = -1; - exval = EXIT_FAILURE; - /* !!!!! ERROR: Decoding */ - } break; - case DK4_EDSTM_FINISHED : { - if ((1 == isfirst) && (0 != argno)) { - if (EOF == fputc(' ', stdout)) { output_error = 1; } - } - isfirst = 0; - (void)dk_t2l_c32_after_cr_nl_check(dk4utf8_get(&dec)); - } break; - } - } else { - cc = 0; - } - } - if (0 == cc) { - if (0 == dk4utf8_is_empty(&dec)) { - exval = EXIT_FAILURE; - /* !!!!! ERROR: Decoding */ - } - } -} - -/** Process one text word from command line, ANSI encoded. - @param txt Text word. - @param argno Number of current word. -*/ -static -void -dk_t2l_echo_ansi(const dkChar *txt, int argno) -{ - dk4_c32_t c32; - int isfirst = 1; - char c; - while ('\0' != *txt) { - c = *(txt++); - if (0 != dk4ansi_decode(&c32, (unsigned char)c)) { - if ((1 == isfirst) && (0 != argno)) { - if (EOF == fputc(' ', stdout)) { output_error = 1; } - } - isfirst = 0; - (void)dk_t2l_c32_after_cr_nl_check(c32); - } else { - /* !!!!! ERROR: Decoding */ - exval = EXIT_FAILURE; - } - } -} - -#endif - - - -/** Process one text word from command line. - @param txt Text word. - @param argno Number of current word. -*/ -static -void -dk_t2l_echo_text(const dkChar *txt, int argno) -{ -#if DK4_CHAR_SIZE > 1 -#if DK4_CHAR_SIZE > 2 - dk_t2l_echo_c32(txt, argno); -#else - dk_t2l_echo_utf16(txt, argno); -#endif -#else - switch (dk4app_get_encoding(app)) { - case DK4_ENCODING_UTF8 : { - dk_t2l_echo_utf8(txt, argno); - } break; - case DK4_ENCODING_WIN1252 : { - dk_t2l_echo_ansi(txt, argno); - } break; - default : { - dk_t2l_echo_ascii(txt, argno); - } break; - } -#endif - dk_t2l_end_math_mode(); -} - - - -/** Process command line arguments. -*/ -static -void -dk_t2l_process_cmdline(void) -{ - const dkChar *xargv; - int argc; - int i; - /* !!!!! TODO: Implementation */ - dk_t2l_output_start_file(); - argc = dk4app_get_argc(app); - if (0 < argc) { - switch (dk_t2l_numeric) { - case 2: { - for (i = 0; i < argc; i++) { - xargv = dk4app_get_argv(app, i); - if (NULL != xargv) { - dk_t2l_echo_hex(xargv); - } - } - dk_t2l_end_math_mode(); - } break; - case 1: { - for (i = 0; i < argc; i++) { - xargv = dk4app_get_argv(app, i); - if (NULL != xargv) { - dk_t2l_echo_numeric(xargv); - } - } - dk_t2l_end_math_mode(); - } break; - default: { - for (i = 0; i < argc; i++) { - xargv = dk4app_get_argv(app, i); - if (NULL != xargv) { - dk_t2l_echo_text(xargv, i); - } - } - } break; - } - if (EOF == fputc('\n', stdout)) { output_error = 1; } - } else { - /* !!!!! ERROR: No command line arguments specified */ - } - dk_t2l_output_finish_file(); -} - - - -/** Process an opened file with file name. - @param fipo Opened file. - @param fn File name. - @param ienc_def Expected input encoding. -*/ -static -void -dk_t2l_process_named_file(FILE *fipo, const dkChar *fn, int ienc_def) -{ - dk4_tsp32_t tsp32; - dk4_er_t er; - dk4_er_t er_en; - dk4_er_t er_pr; - const dkChar *oldsourcefile; - dk4_um_t oldsourceline; - int c; - int cc; - int res; - unsigned char ub; - - dk_t2l_in_mm = 0; - oldsourcefile = dk4app_get_log_source_file(app); - oldsourceline = dk4app_get_log_source_line(app); - dk4app_set_log_source_file(app, fn); - dk4app_set_log_source_line(app, (dk4_um_t)0UL); - dk_t2l_output_start_file(); - dk4error_init(&er); - res = dk4tsp32_setup_char( - &tsp32, NULL, dk_t2l_c32_handler, ienc_def, &er - ); - if (0 != res) { - cc = 1; - while (1 == cc) { - if (0 != dk_t2l_can_continue()) { - c = fgetc(fipo); - if (EOF != c) { - ub = (unsigned char)c; - res = dk4tsp32_add_one_byte(&tsp32, ub); - switch (res) { - case DK4_TSP_RES_ERROR: { - exval = EXIT_FAILURE; - dk4tsp32_get_errors(&er_en, &er_pr, &tsp32); - dk_t2l_report_errors(&er_en, &er_pr); - } break; - case DK4_TSP_RES_FATAL: { - cc = -1; - exval = EXIT_FAILURE; - dk4tsp32_get_errors(&er_en, &er_pr, &tsp32); - dk_t2l_report_errors(&er_en, &er_pr); - } break; - default: { - } break; - } - } else { - cc = 0; - } - if (0 != feof(fipo)) { if (1 == cc) { cc = 0; } } - } else { - cc = -1; - } - } - if (0 == cc) { - res = dk4tsp32_finish(&tsp32); - switch (res) { - case DK4_TSP_RES_ERROR: case DK4_TSP_RES_FATAL: { - exval = EXIT_FAILURE; - dk4tsp32_get_errors(&er_en, &er_pr, &tsp32); - dk_t2l_report_errors(&er_en, &er_pr); - } break; - } - } - if (0 != dk_t2l_can_continue()) { - /* TODO: Finish current line */ - if (0 != dk_t2l_in_mm) { - dk_t2l_end_math_mode(); - if (EOF == fputc('\n', stdout)) { output_error = 1; } - } else { - if (0 == dk_t2l_last_nl) { - if (EOF == fputc('\n', stdout)) { output_error = 1; } - } - } - } - } else { - /* ERROR: Setup failed, should not happen, bug */ - dk4app_log_1(app, dk_t2l_msg, dk_t2l_sz_msg, DK4_LL_ERROR, 10); - exval = EXIT_FAILURE; - } - dk_t2l_output_finish_file(); - dk4app_set_log_source_file(app, oldsourcefile); - dk4app_set_log_source_line(app, oldsourceline); -} - - - -/** Process standard input. -*/ -static -void -dk_t2l_process_stdin(void) -{ -#if DK4_ON_WINDOWS - int oldmode; - - oldmode = _setmode(_fileno(stdin), _O_BINARY); -#endif - dk_t2l_process_named_file(stdin, dk_t2l_kwnl[4], dk_t2l_i_std); -#if DK4_ON_WINDOWS - _setmode(_fileno(stdin), oldmode); -#endif -} - - - -/** Process one real file name. - @param infname File name to process. -*/ -static -void -dk_t2l_process_one_file_name(const dkChar *infname) -{ - FILE *fipo = NULL; - int tests = DK4_FOPEN_SC_IS_REGULAR; - fipo = dk4fopen_app(infname, dk_t2l_kwnl[3], tests, app); - if (NULL != fipo) { - dk_t2l_process_named_file(fipo, infname, dk_t2l_i_file); - fclose(fipo); - } else { - exval = EXIT_FAILURE; - } -} - - - -#if DK4_ON_WINDOWS - -/** Expand file name pattern and process the files. - @pattern File name pattern to expand. - @return 1 if files were found, 0 otherwise. -*/ -static -int -dk_t2l_expand_and_process(const dkChar *pattern) -{ - dkChar buf[DK4_MAX_PATH]; - dk4_dir_t *fne; - const dkChar *shf; - const dkChar *pth; - int cc; - int back = 0; - fne = dk4app_fne_open(pattern, app); - if (NULL != fne) { - cc = 1; - while (1 == cc) { - if (0 != dk_t2l_can_continue()) { - shf = dk4dir_next_file(fne); - if (NULL != shf) { - back = 1; - pth = dk4dir_get_path(fne); - if (NULL != pth) { - if (0 != dk4str_cpy_s(buf, DK4_SIZEOF(buf,dkChar), pth, NULL)) { - if(0!=dk4str_cat_s(buf,DK4_SIZEOF(buf,dkChar),dk_t2l_kwnl[5],NULL)) - { - if(0 != dk4str_cat_s(buf, DK4_SIZEOF(buf,dkChar), shf, NULL)) { - dk_t2l_process_one_file_name(buf); - } else { - /* ERROR: Path too long */ - dk4app_log_base3(app, DK4_LL_ERROR, 98, 99, pth); - exval = EXIT_FAILURE; - } - } - else - { - /* ERROR: Path too long */ - dk4app_log_base3(app, DK4_LL_ERROR, 98, 99, pth); - exval = EXIT_FAILURE; - } - } else { - /* ERROR: Path too long */ - dk4app_log_base3(app, DK4_LL_ERROR, 98, 99, pth); - exval = EXIT_FAILURE; - } - } else { - dk_t2l_process_one_file_name(shf); - } - } else { - cc = 0; - } - } else { - cc = -1; - } - } - dk4dir_close(fne); - } else { - exval = EXIT_FAILURE; - } - return back; -} - -#endif - - - -/** Process one file name, check whether expansion is necessary. - @param infname Input file name to process, may be NULL. -*/ -static -void -dk_t2l_process_filename(const dkChar *infname) -{ - if (NULL != infname) { -#if DK4_ON_WINDOWS - if (0 != dk4path_must_expand(infname)) { - if (0 == dk_t2l_expand_and_process(infname)) { - exval = EXIT_FAILURE; - /* ERROR: No such file */ - dk4app_log_base3(app, DK4_LL_ERROR, 100, 107, infname); - } - } else { -#endif - dk_t2l_process_one_file_name(infname); -#if DK4_ON_WINDOWS - } -#endif - } -} - - - -/** Run after installing the signal handlers. -*/ -static -void -dk_t2l_normal_run(void) -{ - dk4_er_t er; - dk4_stream_t *wstrm; - int argc; - int i; - if (0 != dk_t2l_process_options()) { - exval = EXIT_SUCCESS; - dk_t2l_output_start_page(); - if (0 != dk_t2l_echo) { - dk_t2l_process_cmdline(); - } else { - argc = dk4app_get_argc(app); - if (0 < argc) { - for (i = 0; ((0 != dk_t2l_can_continue()) && (i < argc)); i++) { - dk_t2l_process_filename(dk4app_get_argv(app, i)); - } - } else { - if (0 == dk_t2l_synchk) { - dk_t2l_process_stdin(); - } - } - } - dk_t2l_output_finish_page(); - if (0 != dk4app_opt_is_set_short(app, dkT('r'), NULL)) { - dk4error_init(&er); - wstrm = dk4stream_open_for_file(stdout, DK4_STREAM_WRITE, 0, 0, &er); - if (NULL != wstrm) { - dk4stream_set_output_encoding(wstrm, DK4_FILE_ENCODING_PLAIN); - dk4uc2l_recommendations(uc2l, wstrm, &er); - if (0 == dk4stream_close(wstrm, NULL)) { - /* ERROR: Incomplete output */ - dk4app_log_base1(app, DK4_LL_ERROR, 128); - } - } - else { - /* ERROR: Failed to create stream writer */ - dk4app_log_base1(app, DK4_LL_ERROR, 90); - } - } - if (0 != dk4uc2l_retrieve_errors(uc2l)) { $? "! ERROR" - /* ERROR: Probably incorrect output due to problems */ - dk4app_log_1(app, dk_t2l_msg, dk_t2l_sz_msg, DK4_LL_ERROR, 11); - exval = EXIT_FAILURE; - } - } - if (NULL != uc2l) { - dk4uc2l_close(uc2l); - uc2l = NULL; - } -} - - - -#if DK4_HAVE_SIGACTION -/** Set signal handlers and run. -*/ -static -void -dk_t2l_run_with_signal_handlers(void) -{ -#ifdef SIGPIPE - struct sigaction opipe; -#endif - struct sigaction oint; -#ifdef SIGPIPE - struct sigaction npipe; -#endif - 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_t2l_msg, dk_t2l_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_t2l_msg, dk_t2l_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_t2l_msg, dk_t2l_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_t2l_msg, dk_t2l_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_t2l_msg, dk_t2l_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_t2l_msg, dk_t2l_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_t2l_msg, dk_t2l_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_t2l_msg, dk_t2l_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_t2l_msg, dk_t2l_sz_msg, DK4_LL_ERROR, 0); - goto restore_old_int; - } - - success = 1; - dk_t2l_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_t2l_msg, dk_t2l_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 SIGPIPE settings */ - dk4app_log_1(app, dk_t2l_msg, dk_t2l_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_t2l_msg, dk_t2l_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_t2l_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_t2l_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_t2l_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_t2l_normal_run(); - signal(SIGTERM, oldterm); - signal(SIGINT, oldint); -#ifdef SIGPIPE - signal(SIGPIPE, oldpipe); -#endif -} -#else -/** Set signal handlers and run. -*/ -static -void -dk_t2l_run_with_signal_handlers(void) -{ - dk_t2l_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; - int shp; - $!trace-init dk-t2l.deb - $? "+ main" -#if DK4_CHAR_SIZE > 1 - if (NULL != getenv("VIM")) { silent = 1; } - if (NULL != getenv("VIMRUNTIME")) { silent = 1; } -#endif -#if 0 - dk4fput_initialize_stderr(); -#endif - if (0 != silent) { - app = dk4app_open_silent( - argc, argv, dk_t2l_options, dk_t2l_sz_options, - dk_t2l_kwnl[0], DKT_VERSION_DK, - dk_t2l_kwnl[1], dk_t2l_help_text, dk_t2l_license_text - ); - } - else { - app = dk4app_open_cmd( - argc, argv, dk_t2l_options, dk_t2l_sz_options, - dk_t2l_kwnl[0], DKT_VERSION_DK, - dk_t2l_kwnl[1], dk_t2l_help_text, dk_t2l_license_text - ); - } - if (NULL != app) { - dk_t2l_i_std = dk4app_get_stdin_encoding(app); - dk_t2l_i_file = dk4app_get_file_in_encoding(app); - dk_t2l_sz_msg = dk4app_string_table_size(dk_t2l_kw_def); - dk_t2l_msg = dk4app_string_table(app, dk_t2l_kwnl[2], dk_t2l_kw_def); - if (0 != dk4app_can_run_normally(app)) { - dk_t2l_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_t2l_msg, dk_t2l_sz_msg, DK4_LL_ERROR, 12); - } - if (0 != sig_read_atomic(&sig_had_term)) { - exval = EXIT_FAILURE; - /* ERROR: Interrupted by SIGTERM */ - dk4app_log_1(app, dk_t2l_msg, dk_t2l_sz_msg, DK4_LL_ERROR, 13); - } -#ifdef SIGPIPE - if (0 != sig_read_atomic(&sig_had_pipe)) { - exval = EXIT_FAILURE; - shp = 1; - /* ERROR: Interrupted by SIGPIPE */ - if (0 != verbose) { - dk4app_log_1(app, dk_t2l_msg, dk_t2l_sz_msg, DK4_LL_ERROR, 14); - } - } else { - shp = 0; - } -#else - shp = 0; -#endif - if ((0 == shp) && (0 != output_error)) { - exval = EXIT_FAILURE; - /* ERROR: Output to stdout failed */ - dk4app_log_1(app, dk_t2l_msg, dk_t2l_sz_msg, DK4_LL_ERROR, 15); - } - dk4app_close(app); - } - fflush(stdout); - if (0 != sig_read_atomic(&sig_had_int )) { exval = EXIT_FAILURE; } - if (0 != sig_read_atomic(&sig_had_term)) { exval = EXIT_FAILURE; } -#ifdef SIGPIPE - if (0 != sig_read_atomic(&sig_had_pipe)) { exval = EXIT_FAILURE; } -#endif - if (0 != output_error) { exval = EXIT_FAILURE; } - if (0 == silent) { - fflush(stderr); - dk4fput_cleanup_stderr(); - } - $? "- main %d", exval - $!trace-end - exit(exval); return exval; -} - - |