/* Copyright (C) 2001-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: addctrld.ctr */ #line 9 "addctrld.ctr" /** @file addctrld.c Ensure to have CTRL-D as last byte. This program is a filter. If the final byte in the input stream is not a CTRL-D the program appends a CTRL-D. */ #include "dk4conf.h" #if DK4_HAVE_UNISTD_H #include #endif #if DK4_HAVE_SYS_TYPES_H #include #endif #include #if DK4_HAVE_IO_H #include #endif #if DK4_HAVE_STDLIB_H #include #endif #if DK4_HAVE_PROCESS_H #include #endif #line 45 "addctrld.ctr" #if !DK4_HAVE_SSIZE_T #ifdef DK4_HAVE_SSIZE_T #undef DK4_HAVE_SSIZE_T #endif /** Data type for read/write operation result. */ typedef size_t ssize_t; /** Flag: ssize_t defined. */ #define DK4_HAVE_SSIZE_T 1 #endif /** Length of output buffer in bytes. */ #define BUFFER_SIZE 4096 /** Output buffer. */ static char outbuffer[BUFFER_SIZE]; /** Number of bytes currently used in output buffer. */ static size_t outbused; /** Flush output buffer. */ static void flush_buffer(void) { if(outbused > 0) { #if DK4_ON_WINDOWS (void)_write(1, (void *)outbuffer, (unsigned int)outbused); #else #if DK4_HAVE_WRITE if (((size_t)write(1, (void *)outbuffer, outbused)) != outbused) { /* Intentionally empty */ } #else #if DK4_HAVE__WRITE if (((size_t)_write(1, (void *)outbuffer, outbused)) != outbused) { /* Intentionally empty */ } #else #error "No write() function" #endif #endif #endif } outbused = 0; } /** Add one character to output buffer, flush if buffer is full. @param c Character to add. */ static void add_char(char c) { outbuffer[outbused++] = c; if(outbused == sizeof(outbuffer)) { flush_buffer(); outbused = 0; } } /** The main() function of the addctrld program. @return 0 on success, other values indicate errors. */ int main(void) { char inbuffer[sizeof(outbuffer)]; char *ptr; int ende; ssize_t lgt; int have_ctrld; outbused = 0; ende = 0; have_ctrld = 0; while(ende == 0) { #if DK4_ON_WINDOWS lgt = _read(0, inbuffer, sizeof(inbuffer)); #else #if DK4_HAVE_READ lgt = read(0, inbuffer, sizeof(inbuffer)); #else #if DK4_HAVE__READ lgt = _read(0, inbuffer, sizeof(inbuffer)); #else #error "No read() function!" #endif #endif #endif if(lgt > 0) { ptr = inbuffer; while(lgt--) { if(*ptr == 0x04) have_ctrld = 1; else have_ctrld = 0; add_char(*(ptr++)); } } else { ende = 1; } } if(!have_ctrld) add_char(0x04); flush_buffer(); fflush(stdout); exit(0); return 0; }