/* 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: dk4loc.ctr */ /** @file dk4loc.c The dk4loc module. */ #line 79 "dk4loc.ctr" #include "dk4conf.h" #include "dk4loc.h" #ifndef STDLIB_H_INCLUDED #include #define STDLIB_H_INCLUDED 1 #endif #if DK4_HAVE_STRING_H #ifndef STRING_H_INCLUDED #include #define STRING_H_INCLUDED 1 #endif #endif #if DK4_HAVE_CTYPE_H #ifndef CTYPE_H_INCLUDED #include #define CTYPE_H_INCLUDED 1 #endif #endif #ifndef DK4ENC_H_INCLUDED #include "dk4enc.h" #endif #ifndef DK4STR8_H_INCLUDED #include "dk4str8.h" #endif #if DK4_ON_WINDOWS #ifndef DK4WREG8_H_INCLUDED #include "dk4wreg8.h" #endif #ifndef DK4WREGC_H_INCLUDED #include "dk4wregc.h" #endif #endif #if DK4_HAVE_ASSERT_H #ifndef ASSERT_H_INCLUDED #include #define ASSERT_H_INCLUDED 1 #endif #endif #line 129 "dk4loc.ctr" /** Keywords used by the module. */ static const char * const dk4loc_mod_kw_8[] = { /* 0 */ "LANG", /* 1 */ "utf8", /* 2 */ "UTF-8", /* 3 */ "Control Panel\\International", /* 4 */ "LocaleName", /* 5 */ "sLanguage", NULL #line 152 "dk4loc.ctr" }; static int dk4loc_use_default(dkChar *lptr, size_t szl, dk4_er_t *erp) { int back = 0; if ((NULL != lptr) && (2 < szl)) { lptr[0] = dkT('e'); lptr[1] = dkT('n'); lptr[2] = dkT('\0'); back = 1; } else { dk4error_set_simple_error_code(erp, DK4_E_BUFFER_TOO_SMALL); } return back; } int dk4loc_get_settings( dkChar *lang, size_t szlang, dkChar *reg, size_t szreg, int *enc, dk4_er_t *erp ) { #if DK4_ON_WINDOWS char buf[64]; /* Buffer to process getenv result */ void *kptr; /* Registry key pointer */ dkChar *pd; /* Copy string */ char *p3; /* Region */ char *p4; /* Copy string */ size_t sz; /* String length */ int res; /* Result from RegQueryValueEx() */ int expand = 0; /* Flag: Expansion necessary. */ #else char buf[64]; /* Buffer to process getenv result */ dkChar *pd; /* Copy string */ char *p1; /* Result from getenv */ char *p2; /* Encoding */ char *p3; /* Region */ char *p4; /* Copy string */ size_t sz; /* String length */ #endif int back = 0; #line 203 "dk4loc.ctr" #if DK4_USE_ASSERT assert(NULL != lang); assert(NULL != reg); assert(NULL != enc); assert(0 < szlang); assert(0 < szreg); #endif if ((NULL != lang) && (0 < szlang)) { *lang = dkT('\0'); } if ((NULL != reg ) && (0 < szreg )) { *reg = dkT('\0'); } if (NULL != enc) { #if DK4_ON_WINDOWS *enc = DK4_ENCODING_WIN1252; #else *enc = DK4_ENCODING_PLAIN; #endif } if ((NULL != lang) && (NULL != reg) && (NULL != enc)) { if ((0 < szlang) && (0 < szreg)) { #if DK4_ON_WINDOWS #if DK4_CHAR_SIZE > 1 *enc = DK4_ENCODING_UTF16; #else *enc = DK4_ENCODING_WIN1252; #endif kptr = dk4wreg_open_key_c8(DK4_WREGKEY_HKCU, dk4loc_mod_kw_8[3], 0, erp); if (NULL != kptr) { res = dk4wreg_get_string_c8( kptr, dk4loc_mod_kw_8[4], buf, sizeof(buf), &expand, erp ); if (0 != res) { p3 = dk4str8_chr(buf, '-'); if (NULL != p3) { *(p3++) = '\0'; } dk4str8_normalize(buf, NULL); if (NULL != p3) { dk4str8_normalize(p3, NULL); } sz = dk4str8_len(buf); if (0 < sz) { if (szlang > sz) { /* strcpy(lang, buf); */ pd = lang; p4 = buf; while('\0' != *p4) { *(pd++) = (dkChar)dk4str8_tolower(*(p4++)); } *pd = dkT('\0'); back = 1; sz = dk4str8_len(p3); if (0 < sz) { if (szreg > sz) { /* strcpy(reg, p3); */ pd = reg; p4 = p3; while('\0' != *p4) { #if 0 *(pd++) = (dkChar)(tolower((unsigned char)(*(p4++)))); #endif *(pd++) = (dkChar)dk4str8_tolower(*(p4++)); } *pd = dkT('\0'); } else { dk4error_set_simple_error_code(erp, DK4_E_BUFFER_TOO_SMALL); back = 0; } } } else { dk4error_set_simple_error_code(erp, DK4_E_BUFFER_TOO_SMALL); } } else { back = dk4loc_use_default(lang, szlang, erp); } } else { res = dk4wreg_get_string_c8( kptr, dk4loc_mod_kw_8[5], buf, sizeof(buf), &expand, erp ); if (0 != res) { dk4str8_normalize(buf, NULL); sz = dk4str8_len(buf); if (2 < sz) { buf[2] = '\0'; } sz = dk4str8_len(buf); if (0 < sz) { if (szlang > sz) { pd = lang; p4 = buf; while ('\0' != *p4) { *(pd++) = (dkChar)(tolower((unsigned char)(*(p4++)))); } *pd = dkT('\0'); back = 1; } else { dk4error_set_simple_error_code(erp, DK4_E_BUFFER_TOO_SMALL); } } else { back = dk4loc_use_default(lang, szlang, erp); } } else { back = dk4loc_use_default(lang, szlang, erp); } } dk4wreg_close_key(kptr); } else { back = dk4loc_use_default(lang, szlang, erp); } #else p1 = getenv(dk4loc_mod_kw_8[0]); if (NULL != p1) { #line 304 "dk4loc.ctr" if (sizeof(buf) > dk4str8_len(p1)) { #line 305 "dk4loc.ctr" dk4str8_cpy_s(buf, sizeof(buf), p1, NULL); p2 = dk4str8_chr(buf, '.'); if (NULL != p2) { #line 308 "dk4loc.ctr" *(p2++) = '\0'; #line 309 "dk4loc.ctr" } p3 = dk4str8_chr(buf, '_'); if (NULL != p3) { #line 312 "dk4loc.ctr" *(p3++) = '\0'; #line 313 "dk4loc.ctr" } #line 314 "dk4loc.ctr" dk4str8_normalize(buf, NULL); #line 315 "dk4loc.ctr" if (NULL != p2) { dk4str8_normalize(p2, NULL); } if (NULL != p3) { dk4str8_normalize(p3, NULL); } sz = dk4str8_len(buf); #line 318 "dk4loc.ctr" if (0 < sz) { if (szlang > sz) { /* strcpy(lang, buf); */ pd = lang; p4 = buf; while('\0' != *p4) { *(pd++) = (dkChar)(tolower((unsigned char)(*(p4++)))); } *pd = dkT('\0'); back = 1; if (NULL != p3) { sz = dk4str8_len(p3); if (0 < sz) { if (szreg > sz) { /* strcpy(reg, p3); */ pd = reg; p4 = p3; while('\0' != *p4) { *(pd++) = (dkChar)(tolower((unsigned char)(*(p4++)))); } *pd = dkT('\0'); } else { dk4error_set_simple_error_code(erp, DK4_E_BUFFER_TOO_SMALL); back = 0; } } } #if DK4_CHAR_SIZE > 1 #if DK4_CHAR_SIZE > 2 #line 346 "dk4loc.ctr" *enc = DK4_ENCODING_32; #else #line 349 "dk4loc.ctr" *enc = DK4_ENCODING_UTF16; #endif #else #line 353 "dk4loc.ctr" *enc = DK4_ENCODING_PLAIN; if (NULL != p2) { if (0 == dk4str8_casecmp(p2, dk4loc_mod_kw_8[1])) { *enc = DK4_ENCODING_UTF8; } else { if (0 == dk4str8_casecmp(p2, dk4loc_mod_kw_8[2])) { *enc = DK4_ENCODING_UTF8; } } } #endif } else { #line 365 "dk4loc.ctr" dk4error_set_simple_error_code(erp, DK4_E_BUFFER_TOO_SMALL); } } else { #line 368 "dk4loc.ctr" back = dk4loc_use_default(lang, szlang, erp); } } else { #line 371 "dk4loc.ctr" dk4error_set_simple_error_code(erp, DK4_E_BUFFER_TOO_SMALL); } } else { #line 374 "dk4loc.ctr" back = dk4loc_use_default(lang, szlang, erp); } #endif } else { #line 378 "dk4loc.ctr" dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } } else { #line 381 "dk4loc.ctr" dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } #line 383 "dk4loc.ctr" return back; }