/* 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: dk4bom.ctr */ #ifndef DK4BOM_H_INCLUDED /** Avoid multiple inclusions. */ #define DK4BOM_H_INCLUDED 1 #line 10 "dk4bom.ctr" /** @file Detect BOM (byte order marker) at start of data stream, keep track of unprocessed characters. First, use dk4bom_detect_init() to initialize the state machine. Now use dk4bom_detect_add() to add the data streams contents byte by byte to the state machine as long as the dk4bom_detect_add() function returns DK4_EDSTM_ACCEPT. If the function returns DK4_EDSTM_ERROR, an error occured, you should stop processing. If the function returns DK4_EDSTM_FINISHED or DK4_EDSTM_FINISHED_WITH_UNUSED a BOM was found or definitely not found. Use dk4bom_detect_get_encoding() to obtain the decoding found and process the remaining data stream in that encoding. If the function returned DK4_EDSTM_FINISHED_WITH_UNUSED, use dk4bom_detect_num_unused_bytes() to find the number of unused bytes saved in the detector and dk4bom_detect_unused_byte() to retrieve and process the unused bytes before processing the remaining bytes from the data stream. For a very short data stream, the detection may not be finished at the end of the stream. Use dk4bom_detect_in_detection() to find out whether the detection was not yet finished. If the function returns 1, the detection is not finished and unused bytes are stored in the detector. Use dk4bom_detect_num_unused_bytes() and dk4bom_detect_unused_byte() to obtain the unused bytes. CRT on Windows: Not used. */ #ifndef DK4CONF_H_INCLUDED #if DK4_BUILDING_DKTOOLS4 #include "dk4conf.h" #else #include #endif #endif #ifndef DK4TYPES_H_INCLUDED #if DK4_BUILDING_DKTOOLS4 #include "dk4types.h" #else #include #endif #endif #ifndef DK4EDSTM_H_INCLUDED #if DK4_BUILDING_DKTOOLS4 #include "dk4edstm.h" #else #include #endif #endif #if DK4_HAVE_SYS_TYPES_H #ifndef SYS_TYPES_H_INCLUDED #include #define SYS_TYPES_H_INCLUDED 1 #endif #endif /** State machine to detect a BOM (byte order marker) at the beginning of a data stream. */ typedef struct { size_t rjb; /**< Number of unused bytes. */ int defenc; /**< Default encoding, used if no BOM detected. */ int found; /**< Encoding from the BOM found. */ int state; /**< Current state of BOM detection. */ unsigned char c1; /**< Rejected byte 1. */ unsigned char c2; /**< Rejected byte 2. */ unsigned char c3; /**< Rejected byte 3. */ unsigned char c4; /**< Rejected byte 4. */ } dk4_bom_detector_t; #ifdef __cplusplus extern "C" { #endif /** Initialize the BOM detector. @param ptr BOM detector to initialize. @param defenc Encoding to use if not BOM at beginning of data. */ void dk4bom_detect_init(dk4_bom_detector_t *ptr, int defenc); /** Add one byte to the BOM detector. @param ptr Detector to use. @param byte The data byte to add. @return Operation result, one from: DK4_EDSTM_ACCEPT if you can continue feeding bytes into the detector, DK4_EDSTM_FINISHED if a BOM was detected (do not feed further bytes), DK4_EDSTM_FINISHED_WITH_UNUSED if BOM detection was finished and there are unused bytes stored in the detector), or DK4_EDSTM_ERROR if you attempt to add further bytes after the detection was finished. On DK4_EDSTM_FINISHED and DK4_EDSTM_FINISHED_WITH_UNUSED you can use dk4bom_detect_get_encoding() to retrieve the encoding. On DK4_EDSTM_FINISHED_WITH_UNUSED use dk4bom_detect_num_unused_bytes() and dk4bom_detect_unused_byte() to retrieve the unused bytes from the detector and process them before processing further data from the data stream. */ int dk4bom_detect_add(dk4_bom_detector_t *ptr, unsigned char byte); /** Retrieve the encoding from the detector. @param ptr Detector to use. @return A file encoding, one from: DK4_FILE_ENCODING_PLAIN, DK4_FILE_ENCODING_WIN1252, DK4_FILE_ENCODING_UTF8, DK4_FILE_ENCODING_UTF16_LE, DK4_FILE_ENCODING_UTF16_BE, DK4_FILE_ENCODING_32_LE, or DK4_FILE_ENCODING_32_BE. */ int dk4bom_detect_get_encoding(dk4_bom_detector_t const *ptr); /** Retrieve the number of cted bytes stored in the detector. @param ptr Detector to use. @return Number of unused bytes stored in the detector. */ size_t dk4bom_detect_num_unused_bytes(dk4_bom_detector_t const *ptr); /** Retrieve one unused byte stored in the detector. @param ptr Detector to use. @param num Byte number. @return The byte value. */ unsigned char dk4bom_detect_unused_byte(dk4_bom_detector_t const *ptr, size_t num); /** Check if BOM detection is still in progress. @param ptr Detector to check. @return 1 if detection is in progress and bytes are stored in the detector, 0 otherwise. */ int dk4bom_detect_in_detection(dk4_bom_detector_t const *ptr); #ifdef __cplusplus } #endif #endif