/* 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 */ /** @file dk4bom.c The dk4bom module. */ #line 164 "dk4bom.ctr" #include "dk4conf.h" #include "dk4types.h" #include "dk4enc.h" #include "dk4bom.h" #if DK4_HAVE_ASSERT_H #ifndef ASSERT_H_INCLUDED #include #define ASSERT_H_INCLUDED 1 #endif #endif #line 181 "dk4bom.ctr" void dk4bom_detect_init(dk4_bom_detector_t *ptr, int defenc) { #if DK4_USE_ASSERT assert(NULL != ptr); #endif if (NULL != ptr) { ptr->defenc = defenc; ptr->found = defenc; ptr->state = 0; ptr->rjb = 0; ptr->c1 = 0x00; ptr->c2 = 0x00; ptr->c3 = 0x00; } } /* BOMS and states --------------- UTF-32 LSB: 0xFF (1) 0xFE (2) 0x00 (3) 0x00 UTF-32 MSB: 0x00 (4) 0x00 (5) 0xFE (6) 0xFF UTF-16 LSB: 0xFF (1) 0xFE (2) UTF-16 MSB: 0xFE (7) 0xFF UTF-8: 0xEF (8) 0xBB (9) 0xBF */ int dk4bom_detect_add(dk4_bom_detector_t *ptr, unsigned char byte) { int back = DK4_EDSTM_ERROR; #if DK4_USE_ASSERT assert(NULL != ptr); #endif if (NULL != ptr) { switch (ptr->state) { case 0: { ptr->c1 = byte; ptr->rjb = 1; switch ( (int)byte ) { case 0x00: { ptr->state = 4; back = DK4_EDSTM_ACCEPT; } break; case 0xFF: { ptr->state = 1; back = DK4_EDSTM_ACCEPT; } break; case 0xFE: { ptr->state = 7; back = DK4_EDSTM_ACCEPT; } break; case 0xEF: { ptr->state = 8; back = DK4_EDSTM_ACCEPT; } break; default: { ptr->state = -1; back = DK4_EDSTM_FINISHED_WITH_UNUSED; } break; } } break; case 1: { ptr->c2 = byte; ptr->rjb = 2; if (0xFE == byte) { ptr->state = 2; back = DK4_EDSTM_ACCEPT; ptr->found = DK4_FILE_ENCODING_UTF16_LE; ptr->rjb = 0; } else { ptr->state = -1; back = DK4_EDSTM_FINISHED_WITH_UNUSED; } } break; case 2: { ptr->c1 = byte; ptr->rjb = 1; if (0x00 == byte) { ptr->state = 3; back = DK4_EDSTM_ACCEPT; } else { ptr->state = -1; back = DK4_EDSTM_FINISHED_WITH_UNUSED; ptr->found = DK4_FILE_ENCODING_UTF16_LE; } } break; case 3: { ptr->c2 = byte; ptr->rjb = 2; if (0x00 == byte) { ptr->state = -1; back = DK4_EDSTM_FINISHED; ptr->found = DK4_FILE_ENCODING_32_LE; ptr->rjb = 0; } else { ptr->state = -1; back = DK4_EDSTM_FINISHED_WITH_UNUSED; ptr->found = DK4_FILE_ENCODING_UTF16_LE; } } break; case 4: { ptr->c2 = byte; ptr->rjb = 2; if (0x00 == byte) { ptr->state = 5; back = DK4_EDSTM_ACCEPT; } else { ptr->state = -1; back = DK4_EDSTM_FINISHED_WITH_UNUSED; } } break; case 5: { ptr->c3 = byte; ptr->rjb = 3; if (0xFE == byte) { ptr->state = 6; back = DK4_EDSTM_ACCEPT; } else { ptr->state = -1; back = DK4_EDSTM_FINISHED_WITH_UNUSED; } } break; case 6: { ptr->c4 = byte; ptr->rjb = 4; if (0xFF == byte) { ptr->state = -1; back = DK4_EDSTM_FINISHED; ptr->found = DK4_FILE_ENCODING_32_BE; ptr->rjb = 0; } else { ptr->state = -1; back = DK4_EDSTM_FINISHED_WITH_UNUSED; } } break; case 7: { ptr->c2 = byte; ptr->rjb = 2; if (0xFF == byte) { ptr->state = -1; back = DK4_EDSTM_FINISHED; ptr->found = DK4_FILE_ENCODING_UTF16_BE; ptr->rjb = 0; } else { ptr->state = -1; back = DK4_EDSTM_FINISHED_WITH_UNUSED; } } break; case 8: { ptr->c2 = byte; ptr->rjb = 2; if (0xBB == byte) { ptr->state = 9; back = DK4_EDSTM_ACCEPT; } else { ptr->state = -1; back = DK4_EDSTM_FINISHED_WITH_UNUSED; } } break; case 9: { ptr->c3 = byte; ptr->rjb = 3; if (0xBF == byte) { ptr->state = -1; back = DK4_EDSTM_FINISHED; ptr->found = DK4_FILE_ENCODING_UTF8; ptr->rjb = 0; } else { ptr->state = -1; back = DK4_EDSTM_FINISHED_WITH_UNUSED; } } break; } } return back; } int dk4bom_detect_get_encoding(dk4_bom_detector_t const *ptr) { int back = DK4_ENCODING_PLAIN; #if DK4_USE_ASSERT assert(NULL != ptr); #endif #if DK4_ON_WINDOWS back = DK4_ENCODING_WIN1252; #endif if (NULL != ptr) { back = ptr->found; } return back; } size_t dk4bom_detect_num_unused_bytes(dk4_bom_detector_t const *ptr) { size_t back = 0; #if DK4_USE_ASSERT assert(NULL != ptr); #endif if (NULL != ptr) { back = ptr->rjb; } return back; } unsigned char dk4bom_detect_unused_byte(dk4_bom_detector_t const *ptr, size_t num) { unsigned char back = 0x00; #if DK4_USE_ASSERT assert(NULL != ptr); #endif if (NULL != ptr) { if (0 == num) { back = ptr->c1; } else { if (1 == num) { back = ptr->c2; } else { if (2 == num) { back = ptr->c3; } else { if (3 == num) { back = ptr->c4; } } } } } return back; } int dk4bom_detect_in_detection(dk4_bom_detector_t const *ptr) { int back = 0; #if DK4_USE_ASSERT assert(NULL != ptr); #endif if (NULL != ptr) { if (-1 != ptr->state) { back = 1; } } return back; }