/* 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: dk4enc.ctr */ /** @file dk4enc.c The dk4enc module. */ #line 153 "dk4enc.ctr" #include "dk4conf.h" #include "dk4enc.h" #include "dk4mem.h" #include "dk4strd.h" #if DK4_HAVE_ASSERT_H #ifndef ASSERT_H_INCLUDED #include #define ASSERT_H_INCLUDED 1 #endif #endif /** Encoding names in variations. */ static const dkChar * const dk4enc_encoding_names[] = { /* 0 */ dkT("plain"), /* 1 */ dkT("ascii"), /* 2 */ dkT("ansi"), /* 3 */ dkT("utf-8"), /* 4 */ dkT("utf8"), /* 5 */ dkT("utf-16"), /* 6 */ dkT("utf16"), /* 7 */ dkT("utf-16-le"), /* 8 */ dkT("utf-16le"), /* 9 */ dkT("utf16le"), /* 10 */ dkT("utf-16-lsb"), /* 11 */ dkT("utf-16lsb"), /* 12 */ dkT("utf16lsb"), /* 13 */ dkT("utf-16-be"), /* 14 */ dkT("utf-16be"), /* 15 */ dkT("utf16be"), /* 16 */ dkT("utf-16-msb"), /* 17 */ dkT("utf-16msb"), /* 18 */ dkT("utf16msb"), /* 19 */ dkT("c32"), /* 20 */ dkT("c32-le"), /* 21 */ dkT("c32le"), /* 22 */ dkT("c32-lsb"), /* 23 */ dkT("c32lsb"), /* 24 */ dkT("c32-be"), /* 25 */ dkT("c32be"), /* 26 */ dkT("c32-msb"), /* 27 */ dkT("c32msb"), /* 28 */ dkT("utf-16.msb"), /* 29 */ dkT("utf-16.lsb"), /* 30 */ dkT("uc32"), /* 31 */ dkT("uc32.msb"), /* 32 */ dkT("uc32.lsb"), /* 33 */ dkT("iso-latin-1"), /* 34 */ dkT("iso-8859-1"), /* 35 */ dkT("win1252"), /* 36 */ dkT("cp1252"), NULL #line 245 "dk4enc.ctr" }; /** Keywords for further options. */ static const dkChar * const dk4enc_option_keywords[] = { /* 0 */ dkT("le"), /* 1 */ dkT("lsb"), /* 2 */ dkT("be"), /* 3 */ dkT("msb"), /* 4 */ dkT("bom"), /* 5 */ dkT("nobom"), NULL #line 260 "dk4enc.ctr" }; int dk4enc_find(int *encptr, int *bomptr, const dkChar *src, dk4_er_t *erp) { dkChar buf[64]; /* Private copy for modification */ dkChar *p1; /* Start of text */ dkChar *p2; /* Start of options */ int res = 0; /* Array index */ int back = 0; /* Function result */ int ae = 0; /* Flag: Allow ending specification */ int enc = 0; /* Encoding found */ int bom = 0; /* Flag: BOM keyword found */ int bom_f = 0; /* Flag: BOM information found */ #if DK4_USE_ASSERT assert(NULL != encptr); assert(NULL != src); #endif if ((NULL != encptr) && (NULL != src)) { if (0 != dk4str_cpy_s(buf, DK4_SIZEOF(buf,dkChar), src, erp)) { p1 = dk4str_start(buf, NULL); if (NULL != p1) { p2 = dk4str_chr(buf, dkT(',')); if (NULL == p2) { p2 = dk4str_chr(buf, dkT('.')); } if (NULL != p2) { *(p2++) = dkT('\0'); p2 = dk4str_start(p2, NULL); } dk4str_normalize(p1, NULL); switch (dk4str_array_index(dk4enc_encoding_names, p1, 0)) { case 0: case 1: case 33: case 34: { enc = DK4_FILE_ENCODING_PLAIN; back = 1; } break; case 2: case 35: case 36: { enc = DK4_FILE_ENCODING_WIN1252; back = 1; } break; case 3: case 4: { enc = DK4_FILE_ENCODING_UTF8; back = 1; } break; case 5: case 6: { enc = DK4_ENCODING_UTF16; ae = 1; back = 1; bom = 1; } break; case 7: case 8: case 9: case 10: case 11: case 12: case 29: { enc = DK4_FILE_ENCODING_UTF16_LE; back = 1; bom = 1; } break; case 13: case 14: case 15: case 16: case 17: case 18: case 28: { enc = DK4_FILE_ENCODING_UTF16_BE; back = 1; bom = 1; } break; case 19: case 30: { enc = DK4_ENCODING_32; ae = 1; back = 1; bom = 1; } break; case 20: case 21: case 22: case 23: case 32: { enc = DK4_FILE_ENCODING_32_LE; back = 1; bom = 1; } break; case 24: case 25: case 26: case 27: case 31: { enc = DK4_FILE_ENCODING_32_BE; back = 1; bom = 1; } break; default: { dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); } break; } if (1 == back) { while (NULL != p2) { p1 = dk4str_chr(p2, dkT(',')); if (NULL != p1) { *(p1++) = dkT('\0'); p1 = dk4str_start(p1,NULL); } dk4str_normalize(p2, NULL); switch (res = dk4str_array_index(dk4enc_option_keywords, p2, 0)) { case 0: case 1: case 2: case 3: { if (0 != ae) { switch (enc) { case DK4_ENCODING_UTF16: { enc = ( ((2 == res) || (3 == res)) ? DK4_FILE_ENCODING_UTF16_BE : DK4_FILE_ENCODING_UTF16_LE ); } break; case DK4_ENCODING_32: { enc = ( ((2 == res) || (3 == res)) ? DK4_FILE_ENCODING_32_BE : DK4_FILE_ENCODING_32_LE ); } break; } ae = 0; } else { back = 0; dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); } } break; case 4: { switch (enc) { case DK4_FILE_ENCODING_UTF8: case DK4_FILE_ENCODING_UTF16_LE: case DK4_FILE_ENCODING_UTF16_BE: case DK4_FILE_ENCODING_32_LE: case DK4_FILE_ENCODING_32_BE: { bom = 1; bom_f = 1; } break; default: { back = 0; dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); } break; } } break; case 5: { bom = 0; bom_f = 1; } break; default: { back = 0; dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); } break; } p2 = p1; } } } else { /* ERROR: Empty string */ dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); } } else { dk4error_set_simple_error_code(erp, DK4_E_BUFFER_TOO_SMALL); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } if (NULL != encptr) { *encptr = enc; } if (0 != bom_f) { if (NULL != bomptr) { *bomptr = bom; } } return back; }