summaryrefslogtreecommitdiff
path: root/support/dktools/dk-cat.c
diff options
context:
space:
mode:
Diffstat (limited to 'support/dktools/dk-cat.c')
-rw-r--r--support/dktools/dk-cat.c2426
1 files changed, 0 insertions, 2426 deletions
diff --git a/support/dktools/dk-cat.c b/support/dktools/dk-cat.c
deleted file mode 100644
index 7173878eb8..0000000000
--- a/support/dktools/dk-cat.c
+++ /dev/null
@@ -1,2426 +0,0 @@
-/*
-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: dk-cat.ctr
-*/
-
-
-#line 10 "dk-cat.ctr"
-
-/** @file dk-cat.c The dk-cat program.
- The dk_cat_help_text array below shows 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_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_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
-
-#include "dk4types.h"
-#include "dk4const.h"
-#include "dk4vers.h"
-#include "dk4app.h"
-#include "dk4aopt.h"
-#include "dk4enc.h"
-#include "dk4mem.h"
-#include "dk4strm.h"
-#include "dk4strmf.h"
-#include "dk4strmo32.h"
-#include "dk4istty.h"
-#include "dk4fopda.h"
-#include "dk4tsp32.h"
-#include "dk4tspdk.h"
-#include "dk4mao8d.h"
-#include "dk4str8.h"
-#include "dk4strd.h"
-#include "dk4pathd.h"
-#include "dk4fput.h"
-#include "dk4maodd.h"
-#include "dk4mpl.h"
-#include "dk4isadm.h"
-#include "dk4rec26.h"
-#include "dk4unused.h"
-
-#ifndef DK4WMAIN_H_INCLUDED
-#include "dk4wmain.h"
-#endif
-
-
-
-
-#line 99 "dk-cat.ctr"
-
-
-
-#ifndef DK_CAT_INPUT_BUFFER_SIZE
-/** Input buffer size.
-*/
-#define DK_CAT_INPUT_BUFFER_SIZE 4096
-#endif
-
-
-
-/** Default text, used if help text file is not found.
-*/
-static const dkChar * const dk_cat_help_text[] = {
-dkT(""),
-dkT("Show text files"),
-dkT(""),
-dkT("dk-cat [<options>] [<files>]"),
-dkT(""),
-dkT("Options:"),
-dkT("-c <bool> Enable CR/NL -n Write line numbers"),
-dkT("-i <encoding> Expected input encoding -w Normalize text lines"),
-dkT("-o <encoding> Output encoding -p No unnecessary decoding/encoding"),
-dkT("--help Show this short help text. --manual *** SHOW FULL MANUAL. ***"),
-dkT("--version Show version information. --license Show license information."),
-dkT("--verbose Error message on SIGPIPE"),
-dkT("--line-number-width=<int> Minimum line number width."),
-dkT(""),
-dkT("Encoding names: plain (ASCII text), ascii (synonym for plain), ansi, utf-8,"),
-dkT("utf-16, utf-16le (little-endian) utf-16be (big-endian),"),
-dkT("c32 (32 bit characters), c32le, c32be."),
-dkT(""),
-dkT("http://sourceforge.net/p/dktools/wiki/dk-cat/"),
-dkT(""),
-NULL
-
-
-#line 135 "dk-cat.ctr"
-};
-
-
-
-/** License conditions.
-*/
-static const dkChar * const dk_cat_license_text[] = {
-dkT(""),
-dkT("This software uses code from the following projects, either directly or as"),
-dkT("a library:"),
-dkT(""),
-dkT("dktools\t\tDirk Krause's tools and libraries."),
-dkT("\t\tSee http://sourceforge.net/p/dktools/wiki/Home/"),
-dkT("\t\tfor more information."),
-#if DK4_HAVE_ZLIB_H
-dkT(""),
-dkT("zlib\t\tData compression library."),
-dkT("\t\tSee http://www.zlib.net/ for more information."),
-#endif
-#if DK4_HAVE_BZLIB_H
-dkT(""),
-dkT("bzip2\t\tData compression program and library."),
-dkT("\t\tSee http://www.bzip.org/ for more information."),
-#endif
-dkT(""),
-dkT("All the licenses below apply to the program."),
-dkT("Licenses for used libraries are shown as found on my Scientific Linux 6.x"),
-dkT("computer in the /usr/share/doc directory on 2015-04-01. Check the project"),
-dkT("homepages of the used libraries for additional information and/or updated"),
-dkT("license terms."),
-dkT(""),
-dkT(""),
-dkT("DK tools and libraries license"),
-dkT("=============================="),
-dkT("Copyright (c) 2015-2016, Dirk Krause"),
-dkT("All rights reserved."),
-dkT(""),
-dkT("Redistribution and use in source and binary forms, with or without"),
-dkT("modification, are permitted provided that the following conditions are met:"),
-dkT(""),
-dkT("1. Redistributions of source code must retain the above copyright notice,"),
-dkT(" this list of conditions and the following disclaimer."),
-dkT("2. Redistributions in binary form must reproduce the above copyright"),
-dkT(" notice, this list of conditions and the following disclaimer in the"),
-dkT(" documentation and/or other materials provided with the distribution."),
-dkT("3. Neither the name of the copyright holder nor the names of its"),
-dkT(" contributors may be used to endorse or promote products derived from"),
-dkT(" this software without specific prior written permission."),
-dkT(""),
-dkT("THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS"),
-dkT("``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT"),
-dkT("LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR"),
-dkT("A PARTICULAR PURPOSE ARE DISCLAIMED."),
-dkT("IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY"),
-dkT("DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES"),
-dkT("(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR"),
-dkT("SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER"),
-dkT("CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT"),
-dkT("LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY"),
-dkT("OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF"),
-dkT("SUCH DAMAGE."),
-#if DK4_HAVE_ZLIB_H
-dkT(""),
-dkT(""),
-dkT("Zlib license"),
-dkT("============"),
-dkT("(C) 1995-2004 Jean-loup Gailly and Mark Adler"),
-dkT(""),
-dkT("This software is provided 'as-is', without any express or implied"),
-dkT("warranty. In no event will the authors be held liable for any damages"),
-dkT("arising from the use of this software."),
-dkT(""),
-dkT("Permission is granted to anyone to use this software for any purpose,"),
-dkT("including commercial applications, and to alter it and redistribute it"),
-dkT("freely, subject to the following restrictions:"),
-dkT(""),
-dkT("1. The origin of this software must not be misrepresented; you must not"),
-dkT(" claim that you wrote the original software. If you use this software"),
-dkT(" in a product, an acknowledgment in the product documentation would be"),
-dkT(" appreciated but is not required."),
-dkT("2. Altered source versions must be plainly marked as such, and must not be"),
-dkT(" misrepresented as being the original software."),
-dkT("3. This notice may not be removed or altered from any source distribution."),
-dkT(""),
-dkT("Jean-loup Gailly Mark Adler"),
-dkT("jloup@gzip.org madler@alumni.caltech.edu"),
-#endif
-#if DK4_HAVE_BZLIB_H
-dkT(""),
-dkT(""),
-dkT("Bzip2 and libbzip2 library license"),
-dkT("=================================="),
-dkT("This program, \"bzip2\", the associated library \"libbzip2\", and all"),
-dkT("documentation, are copyright (C) 1996-2007 Julian R Seward. All"),
-dkT("rights reserved."),
-dkT(""),
-dkT("Redistribution and use in source and binary forms, with or without"),
-dkT("modification, are permitted provided that the following conditions"),
-dkT("are met:"),
-dkT(""),
-dkT("1. Redistributions of source code must retain the above copyright"),
-dkT(" notice, this list of conditions and the following disclaimer."),
-dkT(""),
-dkT("2. The origin of this software must not be misrepresented; you must "),
-dkT(" not claim that you wrote the original software. If you use this "),
-dkT(" software in a product, an acknowledgment in the product "),
-dkT(" documentation would be appreciated but is not required."),
-dkT(""),
-dkT("3. Altered source versions must be plainly marked as such, and must"),
-dkT(" not be misrepresented as being the original software."),
-dkT(""),
-dkT("4. The name of the author may not be used to endorse or promote "),
-dkT(" products derived from this software without specific prior written "),
-dkT(" permission."),
-dkT(""),
-dkT("THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS"),
-dkT("OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED"),
-dkT("WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE"),
-dkT("ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY"),
-dkT("DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL"),
-dkT("DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE"),
-dkT("GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS"),
-dkT("INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,"),
-dkT("WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING"),
-dkT("NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS"),
-dkT("SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."),
-dkT(""),
-dkT("Julian Seward, jseward@bzip.org"),
-dkT("bzip2/libbzip2 version 1.0.5 of 10 December 2007"),
-#endif
-dkT(""),
-NULL
-
-
-#line 268 "dk-cat.ctr"
-};
-
-
-
-/** Constant texts used by program, not localized.
-*/
-static const dkChar * const dk_cat_kwnl[] = {
-/* 0 */
-dkT("dktools"),
-
-/* 1 */
-dkT("dk-cat.txt"),
-
-/* 2 */
-dkT("dk-cat.str"),
-
-/* 3 */
-dkT("line-number-width"),
-
-/* 4 */
-dkT("stdin"),
-
-/* 5 */
-dkT("\\"),
-
-/* 6 */
-dkT("verbose"),
-
-NULL
-
-
-#line 305 "dk-cat.ctr"
-};
-
-
-
-/** Constant texts used by program, replaced by localized texts
- if available.
-*/
-static const dkChar * const dk_cat_kw_def[] = {
-/* 0 */
-dkT("Decoding error!\n\tByte: "),
-
-/* 1 */
-dkT("Another decoding error!"),
-
-/* 2 */
-dkT("Further decoding errors!"),
-
-/* 3 */
-dkT("Encoding error!\n\tByte: "),
-
-/* 4 */
-dkT("Another encoding error!"),
-
-/* 5 */
-dkT("Further encoding errors!"),
-
-/* 6 */
-dkT("Processing error!\n\tByte: "),
-
-/* 7 */
-dkT("Another processing error!"),
-
-/* 8 */
-dkT("Further processing errors!"),
-
-/* 9 */
-dkT(",\n\tCharacter: "),
-
-/* 10 */
-dkT(",\n\tPosition in line: "),
-
-/* 11 */
-dkT("Decoding error!"),
-
-/* 12 */
-dkT("Encoding error!"),
-
-/* 13 */
-dkT("Processing error!"),
-
-/* 14 */
-dkT("."),
-
-/* 15 */
-dkT("Illegal input encoding: \""),
-
-/* 16 */
-dkT("\"!"),
-
-/* 17 */
-dkT("Illegal output encoding: \""),
-
-/* 18 */
-dkT("\"!"),
-
-/* 19 */
-dkT("Line number width must be larger than 0!"),
-
-/* 20 */
-dkT("Failed to write text to output!"),
-
-/* 21 */
-dkT("Numeric conversion failed (should not happen, probably bug in program)!"),
-
-/* 22 */
-dkT("Failed to set up signal handlers!"),
-
-/* 23 */
-dkT("Failed to restore signal handlers!"),
-
-/* 24 */
-dkT("Signal received: SIGPIPE!"),
-
-/* 25 */
-dkT("Signal received: SIGINT!"),
-
-NULL
-
-
-#line 383 "dk-cat.ctr"
-};
-
-
-
-/** Message texts, uses localized texts if possible.
-*/
-static const dkChar * const *msg = dk_cat_kw_def;
-
-
-
-/** Options used by program.
-*/
-static const dk4_option_specification_t dk_cat_options[] = {
-
- /* Flag: Line end consists of carriage return and newline.
- */
- { dkT('c'), dkT("crnl"), DK4_OPT_ARG_BOOL },
-
- /* Show line numbers.
- */
- { dkT('n'), dkT("line-numbers"), DK4_OPT_ARG_NONE },
-
- /* Number of digits for line numbers.
- */
- { dkT('\0'), dkT("line-number-width"), DK4_OPT_ARG_SIZE },
-
- /* Flag: Normalize text lines.
- */
- { dkT('w'), dkT("normalize"), DK4_OPT_ARG_NONE },
-
- /* Expected input encoding.
- */
- { dkT('i'), dkT("input-encoding"), DK4_OPT_ARG_STRING },
-
- /* Output encoding to produce.
- */
- { dkT('o'), dkT("output-encoding"), DK4_OPT_ARG_STRING },
-
- /* Pass-through UTF-8 data.
- */
- { dkT('p'), dkT("pass-through"), DK4_OPT_ARG_NONE },
-
- /* Verbose output.
- */
- { dkT('\0'), dkT("verbose"), DK4_OPT_ARG_NONE }
-
-};
-
-
-
-/** Byte order marker.
-*/
-static const dk4_c32_t dk_cat_bom = (dk4_c32_t)(0xFEFFUL);
-
-
-
-#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;
-
-
-
-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;
-}
-
-
-
-/** Application structure.
-*/
-static dk4_app_t *app = NULL;
-
-
-
-/** Number of elements in the dk_cat_options array.
-*/
-static const size_t dk_cat_sz_options =
-sizeof(dk_cat_options)/sizeof(dk4_option_specification_t);
-
-
-
-/** Number of usable elements in the dk_cat_kw_def array and in msg.
-*/
-static size_t sz_msg = (sizeof(dk_cat_kw_def)/sizeof(DK4_PDKCHAR) - 1);
-
-
-/** Name of current input file processed.
-*/
-static const dkChar *input_file_name = NULL;
-
-
-/** Flag: Output already initialized.
-*/
-static int output_initialized = 0;
-
-
-#if DK4_ON_WINDOWS
-/** Original mode for stdout.
-*/
-static int old_output_mode = 0;
-#endif
-
-
-/** Flag: Use stream instead output to stdout.
-*/
-static int use_stream = 1;
-
-
-/** System output encoding.
-*/
-static int oenc_sys =
-#if DK4_ON_WINDOWS
- DK4_FILE_ENCODING_WIN1252
-#else
- DK4_FILE_ENCODING_PLAIN
-#endif
-;
-
-
-/** Default output encoding on the system.
-*/
-static int oenc_def =
-#if DK4_ON_WINDOWS
- DK4_FILE_ENCODING_WIN1252
-#else
- DK4_FILE_ENCODING_PLAIN
-#endif
-;
-
-
-
-/** Output encoding specified on command line.
-*/
-static int oenc =
-#if DK4_ON_WINDOWS
- DK4_FILE_ENCODING_WIN1252
-#else
- DK4_FILE_ENCODING_PLAIN
-#endif
-;
-
-
-/** System setting whether or not to write a BOM.
-*/
-static int obom_sys = 0;
-
-
-/** Flag: Write BOM. -1=auto, 0=no, 1=yes.
-*/
-static int obom = -1;
-
-
-/** Default CR/NL sequence setting.
-*/
-static int crnl_def = DK4_HAVE_LINE_END_CR_NL;
-
-
-/** CR/NL sequence setting from options if available.
-*/
-static int crnl = DK4_HAVE_LINE_END_CR_NL;
-
-
-/** Input encoding specified on the command line.
-*/
-static int ienc_def =
-#if DK4_ON_WINDOWS
- DK4_FILE_ENCODING_WIN1252
-#else
- DK4_FILE_ENCODING_PLAIN
-#endif
-;
-
-
-/** Flag: Show line numbers (from options).
-*/
-static int line_numbers = 0;
-
-
-/** Current line number.
-*/
-static dk4_um_t line_number = (dk4_um_t)1UL;
-
-
-/** Flag: Previous character was carriage return.
-*/
-static int previous_was_cr = 0;
-
-
-/** Flag: Previous character was not a whitespace.
-*/
-static int previous_was_text = 0;
-
-
-/** Flag: Previous character was a newline.
-*/
-static int previous_was_nl = 0;
-
-
-/** Flag: We already had text in this line.
-*/
-static int text_in_line = 0;
-
-
-/** Flag: We had any output for this file.
-*/
-static int there_was_text = 0;
-
-
-/** Flag: Line number was already printed for current line.
-*/
-static int line_number_printed = 0;
-
-
-/** Line number width.
-*/
-static size_t line_number_width = 5;
-
-
-/** Flag: Normalize lines.
-*/
-static int normalize_lines = 0;
-
-
-/** Exit status code.
-*/
-static int exval = EXIT_FAILURE;
-
-
-/** Flag: Already reported encoding errors for this file.
-*/
-static int had_encoding_error = 0;
-
-/** Flag: Already reported decoding errors for this file.
-*/
-static int had_decoding_error = 0;
-
-/** Flag: Already reported processing errors for this file.
-*/
-static int had_processing_error = 0;
-
-/** Flag: Had error while writing to stdout.
-*/
-static int had_write_error = 0;
-
-/** Flag: Verbose output (report SIGPIPE).
-*/
-static int verbose = 0;
-
-
-/** Output stream.
-*/
-static dk4_stream_t *output_stream = NULL;
-
-
-
-/*
- We can output to stdout using dk4fputc() if all the conditions
- below are true:
- - output encoding is system output encoding and
- - CR/NL setting is system CR/NL setting and
- - BOM settings is ``automatic'' or is system BOM setting.
-
- Otherwise we set stdout in binary mode (on Windows only)
- and use a dk4_stream_t to process 32 bit characters.
-*/
-
-/** Initialize settings from application.
- @return 1 on success, 0 on error.
-*/
-static
-int
-initialize_from_app(void)
-{
- dkChar buf[32];
- int res = 0; /* Operation result */
- int back = 1;
-
-
-#line 758 "dk-cat.ctr"
-
- /* String tables and defaults.
- */
-
-
-#line 762 "dk-cat.ctr"
- oenc_sys = dk4app_get_stdout_encoding(app);
- oenc_def = oenc_sys;
- ienc_def = dk4app_get_stdin_encoding(app);
-
-
-#line 766 "dk-cat.ctr"
- if (0 < dk4app_get_argc(app)) {
- ienc_def = dk4app_get_file_in_encoding(app);
-
-
-#line 769 "dk-cat.ctr"
- }
-
- /* Set verbose flag if -v was used.
- */
- if (0 != dk4app_opt_is_set_long(app, dk_cat_kwnl[6], NULL)) {
- verbose = 1;
- }
-
- /* Output encoding to produce (-o)
- */
-
-
-#line 780 "dk-cat.ctr"
- if (0 != dk4app_opt_is_set_short(app, dkT('o'), NULL)) {
-
-#line 781 "dk-cat.ctr"
- res = dk4app_opt_get_string_short(
- buf, DK4_SIZEOF(buf,dkChar), app, dkT('o'), NULL
- );
- if (0 != res) {
-
-#line 785 "dk-cat.ctr"
- res = dk4enc_find(&oenc_def, &obom, buf, NULL);
- if (0 == res) {
-
-#line 787 "dk-cat.ctr"
- /* ERROR: Illegal output encoding */
- dk4app_log_3(app, msg, sz_msg, DK4_LL_ERROR, 17, 18, buf);
- back = 0;
- }
- } else {
-
-#line 792 "dk-cat.ctr"
- /* ERROR: BUG, No option argument */
- back = 0;
- }
- }
-
- /* Expected input encoding (-i)
- */
-
-
-#line 800 "dk-cat.ctr"
- if (0 != dk4app_opt_is_set_short(app, dkT('i'), NULL)) {
-
-#line 801 "dk-cat.ctr"
- res = dk4app_opt_get_string_short(
- buf, DK4_SIZEOF(buf,dkChar), app, dkT('i'), NULL
- );
- if (0 != res) {
-
-#line 805 "dk-cat.ctr"
- res = dk4enc_find(&ienc_def, NULL, buf, NULL);
- if (0 == res) {
-
-#line 807 "dk-cat.ctr"
- /* ERROR: Illegal input encoding */
- dk4app_log_3(app, msg, sz_msg, DK4_LL_ERROR, 15, 16, buf);
- back = 0;
- }
- } else {
-
-#line 812 "dk-cat.ctr"
- /* ERROR: BUG, No option argument */
- back = 0;
- }
- }
-
- /* CR/NL (-c)
- */
-
-
-#line 820 "dk-cat.ctr"
- if (0 != dk4app_opt_is_set_short(app, dkT('c'), NULL)) {
-
-#line 821 "dk-cat.ctr"
- if (0 == dk4app_opt_get_bool_short(&crnl, app, dkT('c'), NULL)) {
- /* ERROR: BUG, No option argument */
- back = 0;
-
-#line 824 "dk-cat.ctr"
- }
- }
-
- /* Line numbers (-n)
- */
-
-
-#line 830 "dk-cat.ctr"
- if (0 != dk4app_opt_is_set_short(app, dkT('n'), NULL)) {
-
-#line 831 "dk-cat.ctr"
- line_numbers = 1;
- }
-
- /* Line number width (--line-number-width)
- */
-
-
-#line 837 "dk-cat.ctr"
- if (0 != dk4app_opt_is_set_long(app, dk_cat_kwnl[3], NULL)) {
-
-#line 838 "dk-cat.ctr"
- if (0 == dk4app_opt_get_size_long(&line_number_width, app, dk_cat_kwnl[3], NULL)) {
- /* ERROR: BUG, No option argument */
- back = 0;
-
-#line 841 "dk-cat.ctr"
- } else {
- if (0 == line_number_width) {
-
-#line 843 "dk-cat.ctr"
- /* ERROR: Illegal line number width */
- dk4app_log_1(app, msg, sz_msg, DK4_LL_ERROR, 19);
- back = 0;
- }
- }
- }
-
- /* Normalize text (-w)
- */
-
-
-#line 853 "dk-cat.ctr"
- if (0 != dk4app_opt_is_set_short(app, dkT('w'), NULL)) {
-
-#line 854 "dk-cat.ctr"
- normalize_lines = 1;
- }
-
-
-
-#line 858 "dk-cat.ctr"
- switch (oenc_sys) {
- case DK4_FILE_ENCODING_PLAIN :
- case DK4_FILE_ENCODING_WIN1252 :
- case DK4_FILE_ENCODING_UTF8 :
- {
- obom_sys = 0;
- } break;
- default :
- {
- if (0 == dk4istty(1, NULL)) {
- obom_sys = 1;
- }
- } break;
- }
- oenc = oenc_def;
-
-
-
-#line 875 "dk-cat.ctr"
- return back;
-}
-
-
-
-/** Check whether we can write to standard output directly.
-*/
-static
-void
-decide_for_output_type(void)
-{
- if (oenc_def == oenc_sys) {
- if (crnl == crnl_def) {
- if ((-1 == obom) || (obom_sys == obom)) {
- use_stream = 0;
- }
- }
- }
-}
-
-
-
-/** Initialize output structures before writing first output.
-*/
-static
-void
-initialize_output(void)
-{
- dk4_er_t er;
-
-
-#line 905 "dk-cat.ctr"
- if (0 == output_initialized) {
- output_initialized = 1;
- if (0 != use_stream) {
- dk4error_init(&er);
-#if DK4_ON_WINDOWS
-
-
-#line 911 "dk-cat.ctr"
- old_output_mode = _setmode(_fileno(stdout), _O_BINARY);
-#endif
- output_stream = dk4stream_open_for_file(
- stdout, DK4_STREAM_WRITE, 0, 4096, &er
- );
- if (NULL != output_stream) {
- dk4stream_set_output_encoding(output_stream, oenc);
- /*
- 2019-09-27
- Attempt to write byte order marker (BOM) if either
- - BOM explicitly required or
- - no BOM information, output encoding is system encoding and
- system encoding indicates BOM.
- */
- if (
- (1 == obom)
- || ((-1 == obom) && (1 == obom_sys) && (oenc == oenc_sys))
- ) {
- if(0 == dk4stream_c32_putc(output_stream, dk_cat_bom, NULL)) {
- /* ERROR: Failed to write BOM */
- dk4app_log_1(app, msg, sz_msg, DK4_LL_ERROR, 20);
- exval = EXIT_FAILURE;
- }
- }
- } else {
- /* ERROR: Failed to create stream */
- dk4app_log_base1(app, DK4_LL_ERROR, 90);
- }
- } else {
- dk4fput_initialize_stdout();
- }
- }
-
-#line 943 "dk-cat.ctr"
-}
-
-
-
-/** Close stream, or set mode for stdout back to original mode.
-*/
-static
-void
-cleanup_output(void)
-{
- dk4_er_t er;
-
-
-#line 955 "dk-cat.ctr"
- if (0 != output_initialized) {
- if (0 != use_stream) {
- if (NULL != output_stream) {
- /* Close output stream.
- */
- dk4error_init(&er);
- if (0 == dk4stream_close(output_stream, &er)) {
- /* ERROR: Closing the stream failed */
- dk4app_log_1(app, msg, sz_msg, DK4_LL_ERROR, 20);
- exval = EXIT_FAILURE;
- }
- }
-#if DK4_ON_WINDOWS
- /* Set stdout to original mode.
- */
-
-
-#line 971 "dk-cat.ctr"
- _setmode(_fileno(stdout), old_output_mode);
-#endif
- } else {
- dk4fput_cleanup_stdout();
- }
- }
-
-#line 977 "dk-cat.ctr"
-}
-
-
-
-/** 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
-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))];
- const dkChar *oldlogname = NULL;
- dk4_um_t oldlogline = (dk4_um_t)0UL;
- int allbuffersok = 0;
-
- oldlogname = dk4app_get_log_source_file(app);
- oldlogline = dk4app_get_log_source_line(app);
- dk4app_set_log_source_file(app, input_file_name);
- 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, msg, sz_msg, DK4_LL_ERROR, i1, 9, 10, 14, b1, b2, b3
- );
- } else {
- dk4app_log_1(
- app, msg, sz_msg, DK4_LL_ERROR, i2
- );
- }
- dk4app_set_log_source_file(app, oldlogname);
- dk4app_set_log_source_line(app, oldlogline);
-}
-
-
-
-/** Report an error occured while writing 32 bit character to
- output stream.
- @param erp Error information returned by dk4stream_c32_putc().
- @param pos Position information.
-*/
-static
-void
-error_while_writing_c32(dk4_er_t *erp, dk4_text_stream_position_t *pos)
-{
- dk4_um_t bytes = (dk4_um_t)0UL;
- dk4_um_t lineno = (dk4_um_t)0UL;
- dk4_um_t chars = (dk4_um_t)0UL;
- dk4_um_t charil = (dk4_um_t)0UL;
- switch (erp->ec) {
- case DK4_E_ENCODING_FAILED : {
- if (NULL != pos) {
- bytes = pos->bytes;
- lineno = pos->lineno;
- chars = pos->chars;
- charil = pos->charil;
- }
- if ((dk4_um_t)0UL < bytes) { bytes = bytes - (dk4_um_t)1UL; }
- if ((dk4_um_t)0UL < chars) { chars = chars - (dk4_um_t)1UL; }
- if ((dk4_um_t)0UL < charil) { charil = charil - (dk4_um_t)1UL; }
- report_with_position(3, 12, bytes, lineno, chars, charil);
- } break;
- default: {
- dk4app_log_1(app, msg, sz_msg, DK4_LL_ERROR, 20);
- } break;
- }
-}
-
-
-
-/** Write one 32 bit character to output.
- If the character is a newline, convert to carriage return and
- newline sequence if required by crnl settings.
- @param c Character to process.
- @param pos Current position in file or data stream.
- @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
-c32_real_output(
- dk4_c32_t c,
- dk4_text_stream_position_t *pos
-)
-{
- dk4_er_t er;
- int back = DK4_TSP_RES_OK;
- dk4_sig_atomic_t shp;
-
-
-
-#line 1090 "dk-cat.ctr"
- initialize_output();
- if (0 != use_stream) {
- if (NULL != output_stream) {
- dk4error_init(&er);
-#ifdef SIGPIPE
- shp = sig_read_atomic(&sig_had_pipe);
-#else
- shp = 0;
-#endif
- if (0 == shp) {
- if ((dkC32(0x0A) == c) && (0 != crnl)) {
- if (0 == dk4stream_c32_putc(output_stream, dkC32(0x0D), &er)) {
- /* ERROR: Failed to write output character */
- error_while_writing_c32(&er, pos);
- back = DK4_TSP_RES_FATAL;
- }
- }
- if (0 == dk4stream_c32_putc(output_stream, c, &er)) {
- /* ERROR: Failed to write output character */
- error_while_writing_c32(&er, pos);
- back = DK4_TSP_RES_FATAL;
- }
- }
- } else {
- /* ERROR: Failed to create output stream (already reported) */
- back = DK4_TSP_RES_FATAL;
- }
- } else {
- }
- if (dkC32(0x0A) == c) {
- previous_was_nl = 1;
- } else {
- previous_was_nl = 0;
- }
- there_was_text = 1;
-
-
-#line 1126 "dk-cat.ctr"
- return back;
-}
-
-
-
-/** Check whether a character is the first character in a line,
- write line number if necessary and write the character.
- @param c Character to process.
- @param pos Current position in file or data stream.
- @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
-c32_after_normalize(
- dk4_c32_t c,
- dk4_text_stream_position_t *pos
-)
-{
- char buf[8*(1+sizeof(dk4_um_t))];
- char *ptr = NULL;
- size_t i = 0;
- int res = 0;
- int back = DK4_TSP_RES_OK;
-
-
-#line 1154 "dk-cat.ctr"
- if (0 != line_numbers) {
- if (0 == line_number_printed) {
- line_number_printed = 1;
- res = dk4ma_write_c8_decimal_unsigned(
- buf, sizeof(buf), line_number, 0, NULL
- );
- if (0 != res) {
- /* Spaces before line number.
- */
- i = dk4str8_len(buf);
- while (i < line_number_width) {
- switch (c32_real_output(dkC32(0x20), pos)) {
- 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;
- }
- i++;
- }
- /* Line number
- */
- ptr = buf;
- while ('\0' != *ptr) {
- res = c32_real_output(
- (dk4_c32_t)((unsigned char)(*(ptr++))), pos
- );
- switch (res) {
- 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;
- }
- }
- /* Trailing space after line number
- */
- switch (c32_real_output(dkC32(0x20), pos)) {
- 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 {
- /* ERROR: Failed to convert line number. */
- dk4app_log_1(app, msg, sz_msg, DK4_LL_ERROR, 21);
- back = DK4_TSP_RES_FATAL;
- }
- }
- switch (c32_real_output(c, pos)) {
- 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 = c32_real_output(c, pos);
- }
-
-#line 1226 "dk-cat.ctr"
- return back;
-}
-
-
-
-/** Normalize the text if required and pass characters downwards.
- @param c Character to process.
- @param pos Current position in file or data stream.
- @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
-c32_after_cr_nl(
- dk4_c32_t c,
- dk4_text_stream_position_t *pos
-)
-{
- int back = DK4_TSP_RES_OK;
-
-
-#line 1249 "dk-cat.ctr"
- if (0 != normalize_lines) {
- if ((dkC32(0x09) == c) || (dkC32(0x20) == c) || (dkC32(0x0D) == c)) {
- previous_was_text = 0;
- } else {
- if (dkC32(0x0A) == c) {
- previous_was_text = 0;
- back = c32_after_normalize(c, pos);
- text_in_line = 0;
- } else {
- if ((0 == previous_was_text) && (0 != text_in_line)) {
- back = c32_after_normalize(dkC32(0x20), pos);
- }
- switch (c32_after_normalize(c, pos)) {
- 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;
- }
- previous_was_text = 1;
- text_in_line = 1;
- }
- }
- } else {
- back = c32_after_normalize(c, pos);
- }
-
-#line 1278 "dk-cat.ctr"
- 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
-c32_handler(
- void * DK4_ARG_UNUSED(obj),
- dk4_c32_t c,
- dk4_text_stream_position_t *pos,
- dk4_er_t * DK4_ARG_UNUSED(erp)
-)
-{
- int back = DK4_TSP_RES_OK;
-
-
-#line 1305 "dk-cat.ctr"
- DK4_UNUSED_ARG(obj)
- DK4_UNUSED_ARG(erp)
- dk4app_set_log_source_line(app, line_number);
- if (dkC32(0x0D) == c) {
-
-#line 1309 "dk-cat.ctr"
- if (0 != previous_was_cr) {
- back = c32_after_cr_nl(dkC32(0x0D), pos);
- }
- previous_was_cr = 1;
- } else {
- if (dkC32(0x0A) == c) {
-
-#line 1315 "dk-cat.ctr"
- back = c32_after_cr_nl(c, pos);
- line_number++;
- dk4app_set_log_source_line(app, line_number);
- line_number_printed = 0;
- text_in_line = 0;
- } else {
-
-#line 1321 "dk-cat.ctr"
- if (0 != previous_was_cr) {
- back = c32_after_cr_nl(dkC32(0x0D), pos);
- }
- switch (c32_after_cr_nl(c, pos)) {
- 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;
- }
- }
- previous_was_cr = 0;
- }
-
-#line 1337 "dk-cat.ctr"
- return back;
-}
-
-
-
-/** Write one dkChar to output (for a newline write a carriage
- return, newline sequence if required).
- @param c Character to process.
- @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
-dkc_real_output(dkChar c)
-{
- dk4_er_t er;
- int back = DK4_TSP_RES_OK;
- dk4_sig_atomic_t shp;
-
-
-#line 1359 "dk-cat.ctr"
- initialize_output();
- dk4error_init(&er);
-#ifdef SIGPIPE
- shp = sig_read_atomic(&sig_had_pipe);
-#else
- shp = 0;
-#endif
- if (0 == shp) {
- if (0 == dk4fputc(c, stdout, &er)) {
- /* ERROR while writing to standard output */
-#if 0
- dk4app_log_1(app, msg, sz_msg, DK4_LL_ERROR, 20);
-#endif
- had_write_error = 0;
- back = DK4_TSP_RES_FATAL;
- exval = EXIT_FAILURE;
- }
- }
- if (dkT('\n') == c) {
- previous_was_nl = 1;
- } else {
- previous_was_nl = 0;
- }
- there_was_text = 1;
-
-
-#line 1384 "dk-cat.ctr"
- return back;
-}
-
-
-
-/** Pass character downwards to dkc_real_output().
- If the character is the first in the line, prepend line
- number if required.
- @param obj Object to modify while processing the character
- (NULL here).
- @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
-dkc_after_normalize(dkChar c)
-{
- char buf[8*(1+sizeof(dk4_um_t))];
- char *ptr = NULL;
- size_t i = 0;
- int res = 0;
- int back = DK4_TSP_RES_OK;
-
-
-#line 1413 "dk-cat.ctr"
- if (0 != line_numbers) {
- if (0 == line_number_printed) {
- line_number_printed = 1;
- res = dk4ma_write_c8_decimal_unsigned(
- buf, sizeof(buf), line_number, 0, NULL
- );
- if (0 != res) {
- /* Spaces before line number.
- */
- i = dk4str8_len(buf);
- while (i < line_number_width) {
- switch (dkc_real_output(dkT(' '))) {
- 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;
- }
- i++;
- }
- /* Line number
- */
- ptr = buf;
- while ('\0' != *ptr) {
- res = dkc_real_output((dkChar)((unsigned char)(*(ptr++))));
- switch (res) {
- 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;
- }
- }
- /* Trailing space after line number
- */
- switch (dkc_real_output(dkT(' '))) {
- 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 {
- /* ERROR: Failed to convert line number. */
- dk4app_log_1(app, msg, sz_msg, DK4_LL_ERROR, 21);
- back = DK4_TSP_RES_FATAL;
- }
- }
- switch (dkc_real_output(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 = dkc_real_output(c);
- }
-
-#line 1483 "dk-cat.ctr"
- return back;
-}
-
-
-
-/** Normalize text if required and pass characters downwards.
- @param obj Object to modify while processing the character
- (NULL here).
- @param c Character to process.
- @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
-dkc_after_cr_nl(
- dkChar c
-)
-{
- int back = DK4_TSP_RES_OK;
-
-
-#line 1506 "dk-cat.ctr"
- if (0 != normalize_lines) {
- if ((dkT('\t') == c) || (dkT(' ') == c) || (dkT('\r') == c)) {
- previous_was_text = 0;
- } else {
- if (dkT('\n') == c) {
- previous_was_text = 0;
- back = dkc_after_normalize(c);
- text_in_line = 0;
- } else {
- if ((0 == previous_was_text) && (0 != text_in_line)) {
- back = dkc_after_normalize(dkT(' '));
- }
- switch (dkc_after_normalize(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;
- }
- previous_was_text = 1;
- text_in_line = 1;
- }
- }
- } else {
- back = dkc_after_normalize(c);
- }
-
-#line 1535 "dk-cat.ctr"
- return back;
-}
-
-
-
-/** Handler function for single characters.
- @param obj Object to modify while processing the character
- (NULL here).
- @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
-dkc_handler(
- void * DK4_ARG_UNUSED(obj),
- dkChar c,
- dk4_text_stream_position_t * DK4_ARG_UNUSED(pos),
- dk4_er_t * DK4_ARG_UNUSED(erp)
-)
-{
- int back = DK4_TSP_RES_OK;
-
-
-#line 1563 "dk-cat.ctr"
- DK4_UNUSED_ARG(obj)
- DK4_UNUSED_ARG(pos)
- DK4_UNUSED_ARG(erp)
- dk4app_set_log_source_line(app, line_number);
- if (dkT('\r') == c) {
- if (0 != previous_was_cr) {
- back = dkc_after_cr_nl(dkT('\r'));
- }
- previous_was_cr = 1;
- } else {
- if (dkT('\n') == c) {
- back = dkc_after_cr_nl(c);
- line_number++;
- dk4app_set_log_source_line(app, line_number);
- line_number_printed = 0;
- text_in_line = 0;
- } else {
- if (0 != previous_was_cr) {
- back = dkc_after_cr_nl(dkT('\r'));
- }
- switch (dkc_after_cr_nl(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;
- }
- }
- previous_was_cr = 0;
- }
-
-
-#line 1597 "dk-cat.ctr"
- return back;
-}
-
-
-
-/** Initialize variables like line number and others for one file.
-*/
-static
-void
-initialize_for_one_file(void)
-{
-
-
-#line 1609 "dk-cat.ctr"
- line_number = (dk4_um_t)1UL;
- previous_was_cr = 0;
- previous_was_nl = 0;
- previous_was_text = 0;
- line_number_printed = 0;
- there_was_text = 0;
- had_encoding_error = 0;
- had_decoding_error = 0;
- had_processing_error = 0;
- text_in_line = 0;
-
-
-#line 1620 "dk-cat.ctr"
-}
-
-
-
-/** Report errors indicated by text processing.
- @param er_en Error report for decoding and encoding errors.
- @param er_pr Error report for processing errors.
-*/
-static
-void
-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 (had_decoding_error) {
- case 0: case 1: {
- report_with_position(
- ((0 == had_decoding_error) ? 0 : 1), 11,
- er_en->dt.fpos.byteno,
- er_en->dt.fpos.lineno,
- er_en->dt.fpos.charno,
- er_en->dt.fpos.charinline
- );
- } break;
- case 2: {
- } break;
- }
- if (3 > had_decoding_error) { had_decoding_error++; }
- } break;
- case DK4_E_ENCODING_FAILED: {
- switch (had_encoding_error) {
- case 0: case 1: {
- report_with_position(
- ((0 == had_encoding_error) ? 3 : 4), 12,
- er_en->dt.fpos.byteno,
- er_en->dt.fpos.lineno,
- er_en->dt.fpos.charno,
- er_en->dt.fpos.charinline
- );
- } break;
- case 2: {
- } break;
- }
- if (3 > had_encoding_error) { had_encoding_error++; }
- } break;
- }
- }
- if (NULL != er_pr) {
- if (DK4_E_NONE != er_pr->ec) {
- switch (had_processing_error) {
- case 0: case 1: {
- report_with_position(
- ((0 == had_processing_error) ? 6 : 7), 13,
- er_en->dt.fpos.byteno,
- er_en->dt.fpos.lineno,
- er_en->dt.fpos.charno,
- er_en->dt.fpos.charinline
- );
- } break;
- case 2: {
- } break;
- }
- if (3 > had_processing_error) { had_processing_error++; }
- }
- }
-}
-
-
-
-/** Process one input file.
- @param fipo File to process.
-*/
-static
-void
-process_one_file(FILE *fipo)
-{
- dk4_tsp32_t tsp32;
- dk4_tspdk_t tspdk;
- dk4_er_t er;
- dk4_er_t er_en;
- dk4_er_t er_pr;
-#if VERSION_1
- size_t sz;
-#endif
- int res;
- int cc;
- int c;
- unsigned char ub;
-
-
-
-#line 1711 "dk-cat.ctr"
- cc = 1;
- initialize_for_one_file();
- dk4error_init(&er);
- if (0 != use_stream) {
-
-#line 1715 "dk-cat.ctr"
- res = dk4tsp32_setup_char(
- &tsp32, NULL, c32_handler, ienc_def, &er
- );
- if (0 != res) {
-
-#line 1719 "dk-cat.ctr"
- do {
- if (0 != sig_can_continue(0)) {
- c = fgetc(fipo);
- if (EOF != c) {
- ub = (unsigned char)c;
- switch (dk4tsp32_add_one_byte(&tsp32, ub)) {
- case DK4_TSP_RES_ERROR: {
- exval = EXIT_FAILURE;
- dk4tsp32_get_errors(&er_en, &er_pr, &tsp32);
- 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);
- report_errors(&er_en, &er_pr);
- } break;
- default: {
- } break;
- }
- } else {
- cc = 0;
- }
- if (0 != feof(fipo)) { if (1 == cc) { cc = 0; } }
- } else {
- cc = -1;
- }
- } while (1 == cc);
- if (0 == cc) {
-
-#line 1748 "dk-cat.ctr"
- res = dk4tsp32_finish(&tsp32);
- switch (res) {
- case DK4_TSP_RES_ERROR: {
-
-#line 1751 "dk-cat.ctr"
- exval = EXIT_FAILURE;
- dk4tsp32_get_errors(&er_en, &er_pr, &tsp32);
- report_errors(&er_en, &er_pr);
- } break;
- case DK4_TSP_RES_FATAL: {
-
-#line 1756 "dk-cat.ctr"
- exval = EXIT_FAILURE;
- dk4tsp32_get_errors(&er_en, &er_pr, &tsp32);
- report_errors(&er_en, &er_pr);
- } break;
- }
- }
- if (0 != sig_can_continue(0)) {
- if ((0 != there_was_text) && (0 == previous_was_nl)) {
- res = c32_real_output(dkC32(0x0A), NULL);
- switch (res) {
- case DK4_TSP_RES_ERROR: {
-
-#line 1767 "dk-cat.ctr"
- exval = EXIT_FAILURE;
- } break;
- case DK4_TSP_RES_FATAL: {
-
-#line 1770 "dk-cat.ctr"
- exval = EXIT_FAILURE;
- } break;
- }
- }
- }
- } else {
-
-#line 1776 "dk-cat.ctr"
- /* BUG, Should not happen */
- exval = EXIT_FAILURE;
- }
- } else {
-
-#line 1780 "dk-cat.ctr"
- res = dk4tspdk_setup_char(
- &tspdk, NULL, dkc_handler, oenc_sys, ienc_def, &er
- );
- if (0 != res) {
- if (0 != dk4app_opt_is_set_short(app, dkT('p'), NULL)) {
-
-
-#line 1786 "dk-cat.ctr"
- dk4tspdk_enable_utf8_pass_through(&tspdk, 1);
- }
- do {
- c = fgetc(fipo);
- if (EOF != c) {
- ub = (unsigned char)c;
- switch (dk4tspdk_add_one_byte(&tspdk, ub)) {
- case DK4_TSP_RES_FATAL: {
- cc = -1;
- exval = EXIT_FAILURE;
- dk4tspdk_get_errors(&er_en, &er_pr, &tspdk);
- report_errors(&er_en, &er_pr);
- } break;
- case DK4_TSP_RES_ERROR: {
- exval = EXIT_FAILURE;
- dk4tspdk_get_errors(&er_en, &er_pr, &tspdk);
- report_errors(&er_en, &er_pr);
- } break;
- default: {
- } break;
- }
- } else {
- cc = 0;
- }
- if (0 != feof(fipo)) { if (1 == cc) { cc = 0; } }
- } while (1 == cc);
- if (0 == cc) {
- res = dk4tspdk_finish(&tspdk);
- switch (res) {
- case DK4_TSP_RES_ERROR: {
- exval = EXIT_FAILURE;
- dk4tspdk_get_errors(&er_en, &er_pr, &tspdk);
- report_errors(&er_en, &er_pr);
- } break;
- case DK4_TSP_RES_FATAL: {
- exval = EXIT_FAILURE;
- dk4tspdk_get_errors(&er_en, &er_pr, &tspdk);
- report_errors(&er_en, &er_pr);
- } break;
- }
- }
- if ((0 != there_was_text) && (0 == previous_was_nl)) {
- res = dkc_real_output(dkT('\n'));
- switch (res) {
- case DK4_TSP_RES_ERROR: {
- exval = EXIT_FAILURE;
- } break;
- case DK4_TSP_RES_FATAL: {
- exval = EXIT_FAILURE;
- } break;
- }
- }
- }
- }
-
-
-#line 1841 "dk-cat.ctr"
-}
-
-
-
-/** Process one input file specified by name.
- @param filename Name of input file to process.
-*/
-static
-void
-process_one_file_name(const dkChar *filename)
-{
- dk4_er_t er;
- FILE *fipo = NULL;
- const dkChar *oldsourcefile;
- dk4_um_t oldsourceline;
- int tests = DK4_FOPEN_SC_USER;
-
-
-#line 1858 "dk-cat.ctr"
- dk4error_init(&er);
- oldsourcefile = dk4app_get_log_source_file(app);
- oldsourceline = dk4app_get_log_source_line(app);
- dk4app_set_log_source_file(app, filename);
- dk4app_set_log_source_line(app, (dk4_um_t)0UL);
-#if 0
- /* File is opened for reading only.
- */
- if (1 == dk4isadmin()) { tests = DK4_FOPEN_SC_PRIVILEGED; }
-#endif
- if (0 != sig_can_continue(1)) {
- fipo = dk4fopen_app(filename, dkT("rb"), tests, app);
- if (NULL != fipo) {
- input_file_name = filename;
- process_one_file(fipo);
- fclose(fipo);
- } else {
- /* ERROR: Failed to open file (already reported) */
- exval = EXIT_FAILURE;
- }
- }
- dk4app_set_log_source_file(app, oldsourcefile);
- dk4app_set_log_source_line(app, oldsourceline);
-
-
-#line 1882 "dk-cat.ctr"
-}
-
-
-
-#if DK4_ON_WINDOWS
-
-static
-void
-expand_and_process(const dkChar *pattern)
-{
- dkChar buf[DK4_MAX_PATH];
- dk4_dir_t *fne;
- const dkChar *shf; /* Short file name */
- const dkChar *pth; /* Path */
- int any_file_found = 0; /* Flag: Any file found */
- int can_continue;
-
- fne = dk4app_fne_open(pattern, app);
- if (NULL != fne) {
- can_continue = 1;
- while ((0 != can_continue) && (NULL != (shf = dk4dir_next_file(fne)))) {
- any_file_found = 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_cat_kwnl[5],NULL))
- {
- if(0 != dk4str_cat_s(buf, DK4_SIZEOF(buf,dkChar), shf, NULL)) {
- process_one_file_name(buf);
- } else {
- exval = EXIT_FAILURE;
- /* ERROR: Path too long */
- dk4app_log_base3(app, DK4_LL_ERROR, 100, 105, pattern);
- }
- }
- else
- {
- exval = EXIT_FAILURE;
- /* ERROR: Path too long */
- dk4app_log_base3(app, DK4_LL_ERROR, 100, 105, pattern);
- }
- } else {
- exval = EXIT_FAILURE;
- /* ERROR: Path too long! */
- dk4app_log_base3(app, DK4_LL_ERROR, 100, 105, pattern);
- }
- } else {
- process_one_file_name(shf);
- }
- can_continue = sig_can_continue(1);
- }
- dk4dir_close(fne);
- if (0 == any_file_found) {
- /* ERROR: No such file */
- dk4app_log_base3(app, DK4_LL_ERROR, 100, 107, pattern);
- exval = EXIT_FAILURE;
- }
- } else {
- /* ERROR: Failed to open file name expander (already reported) */
- exval = EXIT_FAILURE;
- }
-}
-
-#endif
-
-
-
-/** Process all input files specified on command line or standard
- input if no file name is found.
-*/
-static
-void
-process_files(void)
-{
- int argc;
- int i;
- const dkChar *fn;
-#if DK4_ON_WINDOWS
- int oldmode;
-#endif
-
-
-#line 1963 "dk-cat.ctr"
- argc = dk4app_get_argc(app);
- if (0 < argc) {
-
-#line 1965 "dk-cat.ctr"
- for (i = 0; ((i < argc) && (0 != sig_can_continue(1))); i++) {
- fn = dk4app_get_argv(app, i);
- if (NULL != fn) {
-#if DK4_ON_WINDOWS
- if (0 != dk4path_must_expand(fn)) {
- expand_and_process(fn);
- } else {
-#endif
- process_one_file_name(fn);
-#if DK4_ON_WINDOWS
- }
-#endif
- }
- }
- } else {
-
-#line 1980 "dk-cat.ctr"
-#if DK4_ON_WINDOWS
-
-
-#line 1982 "dk-cat.ctr"
- oldmode = _setmode(_fileno(stdin), _O_BINARY);
-#endif
- input_file_name = dk_cat_kwnl[4];
- process_one_file(stdin);
-#if DK4_ON_WINDOWS
-
-
-#line 1988 "dk-cat.ctr"
- _setmode(_fileno(stdin), oldmode);
-#endif
- }
-
-
-#line 1992 "dk-cat.ctr"
-}
-
-
-
-static
-void
-run_the_functions(void)
-{
- process_files();
- fflush(stdout);
- cleanup_output();
-}
-
-
-
-#if DK4_HAVE_SIGACTION
-/** Set signal handlers and run.
-*/
-static
-void
-run_with_signals(void)
-{
-#ifdef SIGPIPE
- struct sigaction opipe;
-#endif
- struct sigaction oint;
- struct sigaction oterm;
-#ifdef SIGPIPE
- struct sigaction npipe;
-#endif
- struct sigaction nint;
- 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, msg, sz_msg, DK4_LL_ERROR, 22);
- goto finished;
- }
- if (0 != sigaddset(&npipe.sa_mask, SIGPIPE)) {
- /* ERROR: Failed to set up masked signal set for SIGPIPE */
- dk4app_log_1(app, msg, sz_msg, DK4_LL_ERROR, 22);
- goto finished;
- }
- if (0 != sigaction(SIGPIPE, &npipe, &opipe)) {
- /* ERROR: Failed to set up signal handler for SIGPIPE */
- dk4app_log_1(app, msg, sz_msg, DK4_LL_ERROR, 22);
- 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, msg, sz_msg, DK4_LL_ERROR, 22);
- 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, msg, sz_msg, DK4_LL_ERROR, 22);
- goto restore_old_pipe;
- }
- if (0 != sigaction(SIGINT, &nint, &oint)) {
- /* ERROR: Failed to set up signal handler for SIGINT */
- dk4app_log_1(app, msg, sz_msg, DK4_LL_ERROR, 22);
- 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, msg, sz_msg, DK4_LL_ERROR, 22);
- 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, msg, sz_msg, DK4_LL_ERROR, 22);
- goto restore_old_int;
- }
- if (0 != sigaction(SIGTERM, &nterm, &oterm)) {
- /* ERROR: Failed to set up signal handler for SIGTERM */
- dk4app_log_1(app, msg, sz_msg, DK4_LL_ERROR, 22);
- goto restore_old_int;
- }
-
- success = 1;
- run_the_functions();
-
- /* Restore signal handling for SIGTERM.
- */
- if (0 != sigaction(SIGTERM, &oterm, NULL)) {
- /* ERROR: Failed to restore old SIGTERM settings */
- dk4app_log_1(app, msg, sz_msg, DK4_LL_ERROR, 23);
- 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, msg, sz_msg, DK4_LL_ERROR, 23);
- 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, msg, sz_msg, DK4_LL_ERROR, 23);
- 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
-run_with_signals(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);
- run_the_functions();
- sigset(SIGTERM, oldterm);
- sigset(SIGINT, oldint);
-#ifdef SIGPIPE
- sigset(SIGPIPE, oldpipe);
-#endif
-}
-#else
-#if DK4_HAVE_SIGNAL
-/** Set signal handlers and run.
-*/
-static
-void
-run_with_signals(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);
- run_the_functions();
- signal(SIGTERM, oldterm);
- signal(SIGINT, oldint);
-#ifdef SIGPIPE
- signal(SIGPIPE, oldpipe);
-#endif
-}
-#else
-/** Set signal handlers and run.
-*/
-static
-void
-run_with_signals(void)
-{
- run_the_functions();
-}
-#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
-{
- dk4_sig_atomic_t shp;
-
-
-#line 2206 "dk-cat.ctr"
-
-
-#line 2207 "dk-cat.ctr"
- app = dk4app_open_cmd(
- argc, argv, dk_cat_options, dk_cat_sz_options,
- dk_cat_kwnl[0], DKT_VERSION_DK,
- dk_cat_kwnl[1], dk_cat_help_text, dk_cat_license_text
- );
- if (NULL != app) {
- sz_msg = dk4app_string_table_size(dk_cat_kw_def);
- msg = dk4app_string_table(app, dk_cat_kwnl[2], dk_cat_kw_def);
- if (0 != dk4app_can_run_normally(app)) {
- if (0 != initialize_from_app()) {
- decide_for_output_type();
- exval = EXIT_SUCCESS;
- run_with_signals();
-#ifdef SIGPIPE
- shp = sig_read_atomic(&sig_had_pipe);
-#else
- shp = 0;
-#endif
- if (0 != shp) {
- if (0 != verbose) {
- dk4app_log_1(app, msg, sz_msg, DK4_LL_ERROR, 24);
- }
- exval = EXIT_FAILURE;
- } else {
- if (0 != had_write_error) {
- dk4app_log_1(app, msg, sz_msg, DK4_LL_ERROR, 20);
- exval = EXIT_FAILURE;
- }
- }
- if (0 != sig_read_atomic(&sig_had_int)) {
- dk4app_log_1(app, msg, sz_msg, DK4_LL_ERROR, 25);
- }
- }
- } else {
- if (0 != dk4app_help_version_license(app)) {
- exval = EXIT_SUCCESS;
- }
- }
- dk4app_close(app);
- }
-
-
-#line 2248 "dk-cat.ctr"
-
-
-#line 2249 "dk-cat.ctr"
- exit(exval); return exval;
-}
-