Bug Summary

File:_build/../ctksourceview/ctksourceencoding.c
Warning:line 661, column 40
Casting a non-structure type to a structure type and accessing a field can lead to memory access errors or data corruption

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name ctksourceencoding.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=none -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/rootdir/_build -fcoverage-compilation-dir=/rootdir/_build -resource-dir /usr/lib/llvm-19/lib/clang/19 -I ctksourceview/libctksourceview-4core.a.p -I ctksourceview -I ../ctksourceview -I . -I .. -I /usr/include/fribidi -I /usr/include/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include -I /usr/include/sysprof-6 -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/ctk-3.0 -I /usr/include/pango-1.0 -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/libpng16 -I /usr/include/cairo -I /usr/include/pixman-1 -I /usr/include/gdk-pixbuf-2.0 -I /usr/include/x86_64-linux-gnu -I /usr/include/webp -I /usr/include/gio-unix-2.0 -I /usr/include/atk-1.0 -I /usr/include/at-spi2-atk/2.0 -I /usr/include/at-spi-2.0 -I /usr/include/dbus-1.0 -I /usr/lib/x86_64-linux-gnu/dbus-1.0/include -I /usr/include/libxml2 -D _FILE_OFFSET_BITS=64 -D G_DISABLE_DEPRECATED -D CDK_DISABLE_DEPRECATED -D CTK_DISABLE_DEPRECATED -D GDK_PIXBUF_DISABLE_DEPRECATED -D CDK_VERSION_MIN_REQUIRED=CDK_VERSION_3_24 -D CDK_VERSION_MAX_ALLOWED=CDK_VERSION_3_24 -D GLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_48 -D GLIB_VERSION_MAX_ALLOWED=GLIB_VERSION_2_48 -D HAVE_CONFIG_H -D CTK_SOURCE_COMPILATION -D G_LOG_DOMAIN="CtkSourceView" -internal-isystem /usr/lib/llvm-19/lib/clang/19/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-cast-function-type -Wno-missing-field-initializers -Wno-sign-compare -Wno-unused-parameter -std=gnu99 -ferror-limit 19 -stack-protector 2 -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fcolor-diagnostics -vectorize-loops -vectorize-slp -analyzer-checker deadcode.DeadStores -analyzer-checker alpha.deadcode.UnreachableCode -analyzer-checker alpha.core.CastSize -analyzer-checker alpha.core.CastToStruct -analyzer-checker alpha.core.IdenticalExpr -analyzer-checker alpha.security.ArrayBoundV2 -analyzer-checker alpha.security.MallocOverflow -analyzer-checker alpha.security.ReturnPtrRange -analyzer-checker alpha.unix.SimpleStream -analyzer-checker alpha.unix.cstring.BufferOverlap -analyzer-checker alpha.unix.cstring.NotNullTerminated -analyzer-checker alpha.unix.cstring.OutOfBounds -analyzer-checker alpha.core.FixedAddr -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /rootdir/html-report/2025-07-24-143421-13989-1 -x c ../ctksourceview/ctksourceencoding.c
1/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; coding: utf-8 -*- */
2/*
3 * This file is part of CtkSourceView
4 *
5 * Copyright (C) 2002-2005 - Paolo Maggi
6 * Copyright (C) 2014, 2015 - Sébastien Wilmet <swilmet@gnome.org>
7 *
8 * CtkSourceView is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * CtkSourceView is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public License
19 * along with this library; if not, see <http://www.gnu.org/licenses/>.
20 */
21
22#ifdef HAVE_CONFIG_H1
23#include <config.h>
24#endif
25
26#include "ctksourceencoding.h"
27#include "ctksourceencoding-private.h"
28#include <glib/gi18n-lib.h>
29
30/**
31 * SECTION:encoding
32 * @Short_description: Character encoding
33 * @Title: CtkSourceEncoding
34 * @See_also: #CtkSourceFileSaver, #CtkSourceFileLoader
35 *
36 * The #CtkSourceEncoding boxed type represents a character encoding. It is used
37 * for example by #CtkSourceFile. Note that the text in CTK+ widgets is always
38 * encoded in UTF-8.
39 */
40
41struct _CtkSourceEncoding
42{
43 gint index;
44 const gchar *charset;
45 const gchar *name;
46};
47
48G_DEFINE_BOXED_TYPE (CtkSourceEncoding, ctk_source_encoding,static GType ctk_source_encoding_get_type_once (void); GType ctk_source_encoding_get_type
(void) { static gsize static_g_define_type_id = 0; if ((__extension__
({ _Static_assert (sizeof *(&static_g_define_type_id) ==
sizeof (gpointer), "Expression evaluates to false"); (void) (
0 ? (gpointer) *(&static_g_define_type_id) : ((void*)0));
(!(__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id
) == sizeof (gpointer), "Expression evaluates to false"); __typeof__
(*(&static_g_define_type_id)) gapg_temp_newval; __typeof__
((&static_g_define_type_id)) gapg_temp_atomic = (&static_g_define_type_id
); __atomic_load (gapg_temp_atomic, &gapg_temp_newval, 5)
; gapg_temp_newval; })) && g_once_init_enter (&static_g_define_type_id
)); }))) { GType g_define_type_id = ctk_source_encoding_get_type_once
(); (__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id
) == sizeof (gpointer), "Expression evaluates to false"); 0 ?
(void) (*(&static_g_define_type_id) = (g_define_type_id)
) : (void) 0; g_once_init_leave ((&static_g_define_type_id
), (gsize) (g_define_type_id)); })); } return static_g_define_type_id
; } __attribute__ ((__noinline__)) static GType ctk_source_encoding_get_type_once
(void) { GType (* _g_register_boxed) (const gchar *, union {
CtkSourceEncoding * (*do_copy_type) (CtkSourceEncoding *); CtkSourceEncoding
* (*do_const_copy_type) (const CtkSourceEncoding *); GBoxedCopyFunc
do_copy_boxed; } __attribute__((__transparent_union__)), union
{ void (* do_free_type) (CtkSourceEncoding *); GBoxedFreeFunc
do_free_boxed; } __attribute__((__transparent_union__)) ) = g_boxed_type_register_static
; GType g_define_type_id = _g_register_boxed (g_intern_static_string
("CtkSourceEncoding"), ctk_source_encoding_copy, ctk_source_encoding_free
); { {{};} } return g_define_type_id; }
49 ctk_source_encoding_copy,static GType ctk_source_encoding_get_type_once (void); GType ctk_source_encoding_get_type
(void) { static gsize static_g_define_type_id = 0; if ((__extension__
({ _Static_assert (sizeof *(&static_g_define_type_id) ==
sizeof (gpointer), "Expression evaluates to false"); (void) (
0 ? (gpointer) *(&static_g_define_type_id) : ((void*)0));
(!(__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id
) == sizeof (gpointer), "Expression evaluates to false"); __typeof__
(*(&static_g_define_type_id)) gapg_temp_newval; __typeof__
((&static_g_define_type_id)) gapg_temp_atomic = (&static_g_define_type_id
); __atomic_load (gapg_temp_atomic, &gapg_temp_newval, 5)
; gapg_temp_newval; })) && g_once_init_enter (&static_g_define_type_id
)); }))) { GType g_define_type_id = ctk_source_encoding_get_type_once
(); (__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id
) == sizeof (gpointer), "Expression evaluates to false"); 0 ?
(void) (*(&static_g_define_type_id) = (g_define_type_id)
) : (void) 0; g_once_init_leave ((&static_g_define_type_id
), (gsize) (g_define_type_id)); })); } return static_g_define_type_id
; } __attribute__ ((__noinline__)) static GType ctk_source_encoding_get_type_once
(void) { GType (* _g_register_boxed) (const gchar *, union {
CtkSourceEncoding * (*do_copy_type) (CtkSourceEncoding *); CtkSourceEncoding
* (*do_const_copy_type) (const CtkSourceEncoding *); GBoxedCopyFunc
do_copy_boxed; } __attribute__((__transparent_union__)), union
{ void (* do_free_type) (CtkSourceEncoding *); GBoxedFreeFunc
do_free_boxed; } __attribute__((__transparent_union__)) ) = g_boxed_type_register_static
; GType g_define_type_id = _g_register_boxed (g_intern_static_string
("CtkSourceEncoding"), ctk_source_encoding_copy, ctk_source_encoding_free
); { {{};} } return g_define_type_id; }
50 ctk_source_encoding_free)static GType ctk_source_encoding_get_type_once (void); GType ctk_source_encoding_get_type
(void) { static gsize static_g_define_type_id = 0; if ((__extension__
({ _Static_assert (sizeof *(&static_g_define_type_id) ==
sizeof (gpointer), "Expression evaluates to false"); (void) (
0 ? (gpointer) *(&static_g_define_type_id) : ((void*)0));
(!(__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id
) == sizeof (gpointer), "Expression evaluates to false"); __typeof__
(*(&static_g_define_type_id)) gapg_temp_newval; __typeof__
((&static_g_define_type_id)) gapg_temp_atomic = (&static_g_define_type_id
); __atomic_load (gapg_temp_atomic, &gapg_temp_newval, 5)
; gapg_temp_newval; })) && g_once_init_enter (&static_g_define_type_id
)); }))) { GType g_define_type_id = ctk_source_encoding_get_type_once
(); (__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id
) == sizeof (gpointer), "Expression evaluates to false"); 0 ?
(void) (*(&static_g_define_type_id) = (g_define_type_id)
) : (void) 0; g_once_init_leave ((&static_g_define_type_id
), (gsize) (g_define_type_id)); })); } return static_g_define_type_id
; } __attribute__ ((__noinline__)) static GType ctk_source_encoding_get_type_once
(void) { GType (* _g_register_boxed) (const gchar *, union {
CtkSourceEncoding * (*do_copy_type) (CtkSourceEncoding *); CtkSourceEncoding
* (*do_const_copy_type) (const CtkSourceEncoding *); GBoxedCopyFunc
do_copy_boxed; } __attribute__((__transparent_union__)), union
{ void (* do_free_type) (CtkSourceEncoding *); GBoxedFreeFunc
do_free_boxed; } __attribute__((__transparent_union__)) ) = g_boxed_type_register_static
; GType g_define_type_id = _g_register_boxed (g_intern_static_string
("CtkSourceEncoding"), ctk_source_encoding_copy, ctk_source_encoding_free
); { {{};} } return g_define_type_id; }
51
52/*
53 * The original versions of the following tables are taken from profterm
54 *
55 * Copyright (C) 2002 Red Hat, Inc.
56 */
57
58typedef enum _CtkSourceEncodingIndex
59{
60 CTK_SOURCE_ENCODING_ISO_8859_1,
61 CTK_SOURCE_ENCODING_ISO_8859_2,
62 CTK_SOURCE_ENCODING_ISO_8859_3,
63 CTK_SOURCE_ENCODING_ISO_8859_4,
64 CTK_SOURCE_ENCODING_ISO_8859_5,
65 CTK_SOURCE_ENCODING_ISO_8859_6,
66 CTK_SOURCE_ENCODING_ISO_8859_7,
67 CTK_SOURCE_ENCODING_ISO_8859_8,
68 CTK_SOURCE_ENCODING_ISO_8859_9,
69 CTK_SOURCE_ENCODING_ISO_8859_10,
70 CTK_SOURCE_ENCODING_ISO_8859_13,
71 CTK_SOURCE_ENCODING_ISO_8859_14,
72 CTK_SOURCE_ENCODING_ISO_8859_15,
73 CTK_SOURCE_ENCODING_ISO_8859_16,
74
75 CTK_SOURCE_ENCODING_UTF_7,
76 CTK_SOURCE_ENCODING_UTF_16,
77 CTK_SOURCE_ENCODING_UTF_16_BE,
78 CTK_SOURCE_ENCODING_UTF_16_LE,
79 CTK_SOURCE_ENCODING_UTF_32,
80 CTK_SOURCE_ENCODING_UCS_2,
81 CTK_SOURCE_ENCODING_UCS_4,
82
83 CTK_SOURCE_ENCODING_ARMSCII_8,
84 CTK_SOURCE_ENCODING_BIG5,
85 CTK_SOURCE_ENCODING_BIG5_HKSCS,
86 CTK_SOURCE_ENCODING_CP_866,
87
88 CTK_SOURCE_ENCODING_EUC_JP,
89 CTK_SOURCE_ENCODING_EUC_JP_MS,
90 CTK_SOURCE_ENCODING_CP932,
91 CTK_SOURCE_ENCODING_EUC_KR,
92 CTK_SOURCE_ENCODING_EUC_TW,
93
94 CTK_SOURCE_ENCODING_GB18030,
95 CTK_SOURCE_ENCODING_GB2312,
96 CTK_SOURCE_ENCODING_GBK,
97 CTK_SOURCE_ENCODING_GEOSTD8,
98
99 CTK_SOURCE_ENCODING_IBM_850,
100 CTK_SOURCE_ENCODING_IBM_852,
101 CTK_SOURCE_ENCODING_IBM_855,
102 CTK_SOURCE_ENCODING_IBM_857,
103 CTK_SOURCE_ENCODING_IBM_862,
104 CTK_SOURCE_ENCODING_IBM_864,
105
106 CTK_SOURCE_ENCODING_ISO_2022_JP,
107 CTK_SOURCE_ENCODING_ISO_2022_KR,
108 CTK_SOURCE_ENCODING_ISO_IR_111,
109 CTK_SOURCE_ENCODING_JOHAB,
110 CTK_SOURCE_ENCODING_KOI8_R,
111 CTK_SOURCE_ENCODING_KOI8__R,
112 CTK_SOURCE_ENCODING_KOI8_U,
113
114 CTK_SOURCE_ENCODING_SHIFT_JIS,
115 CTK_SOURCE_ENCODING_TCVN,
116 CTK_SOURCE_ENCODING_TIS_620,
117 CTK_SOURCE_ENCODING_UHC,
118 CTK_SOURCE_ENCODING_VISCII,
119
120 CTK_SOURCE_ENCODING_WINDOWS_1250,
121 CTK_SOURCE_ENCODING_WINDOWS_1251,
122 CTK_SOURCE_ENCODING_WINDOWS_1252,
123 CTK_SOURCE_ENCODING_WINDOWS_1253,
124 CTK_SOURCE_ENCODING_WINDOWS_1254,
125 CTK_SOURCE_ENCODING_WINDOWS_1255,
126 CTK_SOURCE_ENCODING_WINDOWS_1256,
127 CTK_SOURCE_ENCODING_WINDOWS_1257,
128 CTK_SOURCE_ENCODING_WINDOWS_1258,
129
130 CTK_SOURCE_ENCODING_LAST,
131
132 CTK_SOURCE_ENCODING_UTF_8,
133 CTK_SOURCE_ENCODING_UNKNOWN
134} CtkSourceEncodingIndex;
135
136static const CtkSourceEncoding utf8_encoding =
137{
138 CTK_SOURCE_ENCODING_UTF_8,
139 "UTF-8",
140 N_("Unicode")("Unicode")
141};
142
143/* Initialized in ctk_source_encoding_lazy_init(). */
144static CtkSourceEncoding unknown_encoding =
145{
146 CTK_SOURCE_ENCODING_UNKNOWN,
147 NULL((void*)0),
148 NULL((void*)0)
149};
150
151static const CtkSourceEncoding encodings[] =
152{
153 { CTK_SOURCE_ENCODING_ISO_8859_1,
154 "ISO-8859-1", N_("Western")("Western") },
155 { CTK_SOURCE_ENCODING_ISO_8859_2,
156 "ISO-8859-2", N_("Central European")("Central European") },
157 { CTK_SOURCE_ENCODING_ISO_8859_3,
158 "ISO-8859-3", N_("South European")("South European") },
159 { CTK_SOURCE_ENCODING_ISO_8859_4,
160 "ISO-8859-4", N_("Baltic")("Baltic") },
161 { CTK_SOURCE_ENCODING_ISO_8859_5,
162 "ISO-8859-5", N_("Cyrillic")("Cyrillic") },
163 { CTK_SOURCE_ENCODING_ISO_8859_6,
164 "ISO-8859-6", N_("Arabic")("Arabic") },
165 { CTK_SOURCE_ENCODING_ISO_8859_7,
166 "ISO-8859-7", N_("Greek")("Greek") },
167 { CTK_SOURCE_ENCODING_ISO_8859_8,
168 "ISO-8859-8", N_("Hebrew Visual")("Hebrew Visual") },
169 { CTK_SOURCE_ENCODING_ISO_8859_9,
170 "ISO-8859-9", N_("Turkish")("Turkish") },
171 { CTK_SOURCE_ENCODING_ISO_8859_10,
172 "ISO-8859-10", N_("Nordic")("Nordic") },
173 { CTK_SOURCE_ENCODING_ISO_8859_13,
174 "ISO-8859-13", N_("Baltic")("Baltic") },
175 { CTK_SOURCE_ENCODING_ISO_8859_14,
176 "ISO-8859-14", N_("Celtic")("Celtic") },
177 { CTK_SOURCE_ENCODING_ISO_8859_15,
178 "ISO-8859-15", N_("Western")("Western") },
179 { CTK_SOURCE_ENCODING_ISO_8859_16,
180 "ISO-8859-16", N_("Romanian")("Romanian") },
181
182 { CTK_SOURCE_ENCODING_UTF_7,
183 "UTF-7", N_("Unicode")("Unicode") },
184 { CTK_SOURCE_ENCODING_UTF_16,
185 "UTF-16", N_("Unicode")("Unicode") },
186 { CTK_SOURCE_ENCODING_UTF_16_BE,
187 "UTF-16BE", N_("Unicode")("Unicode") },
188 { CTK_SOURCE_ENCODING_UTF_16_LE,
189 "UTF-16LE", N_("Unicode")("Unicode") },
190 { CTK_SOURCE_ENCODING_UTF_32,
191 "UTF-32", N_("Unicode")("Unicode") },
192 { CTK_SOURCE_ENCODING_UCS_2,
193 "UCS-2", N_("Unicode")("Unicode") },
194 { CTK_SOURCE_ENCODING_UCS_4,
195 "UCS-4", N_("Unicode")("Unicode") },
196
197 { CTK_SOURCE_ENCODING_ARMSCII_8,
198 "ARMSCII-8", N_("Armenian")("Armenian") },
199 { CTK_SOURCE_ENCODING_BIG5,
200 "BIG5", N_("Chinese Traditional")("Chinese Traditional") },
201 { CTK_SOURCE_ENCODING_BIG5_HKSCS,
202 "BIG5-HKSCS", N_("Chinese Traditional")("Chinese Traditional") },
203 { CTK_SOURCE_ENCODING_CP_866,
204 "CP866", N_("Cyrillic/Russian")("Cyrillic/Russian") },
205
206 { CTK_SOURCE_ENCODING_EUC_JP,
207 "EUC-JP", N_("Japanese")("Japanese") },
208 { CTK_SOURCE_ENCODING_EUC_JP_MS,
209 "EUC-JP-MS", N_("Japanese")("Japanese") },
210 { CTK_SOURCE_ENCODING_CP932,
211 "CP932", N_("Japanese")("Japanese") },
212
213 { CTK_SOURCE_ENCODING_EUC_KR,
214 "EUC-KR", N_("Korean")("Korean") },
215 { CTK_SOURCE_ENCODING_EUC_TW,
216 "EUC-TW", N_("Chinese Traditional")("Chinese Traditional") },
217
218 { CTK_SOURCE_ENCODING_GB18030,
219 "GB18030", N_("Chinese Simplified")("Chinese Simplified") },
220 { CTK_SOURCE_ENCODING_GB2312,
221 "GB2312", N_("Chinese Simplified")("Chinese Simplified") },
222 { CTK_SOURCE_ENCODING_GBK,
223 "GBK", N_("Chinese Simplified")("Chinese Simplified") },
224 { CTK_SOURCE_ENCODING_GEOSTD8,
225 "GEORGIAN-ACADEMY", N_("Georgian")("Georgian") }, /* FIXME GEOSTD8 ? */
226
227 { CTK_SOURCE_ENCODING_IBM_850,
228 "IBM850", N_("Western")("Western") },
229 { CTK_SOURCE_ENCODING_IBM_852,
230 "IBM852", N_("Central European")("Central European") },
231 { CTK_SOURCE_ENCODING_IBM_855,
232 "IBM855", N_("Cyrillic")("Cyrillic") },
233 { CTK_SOURCE_ENCODING_IBM_857,
234 "IBM857", N_("Turkish")("Turkish") },
235 { CTK_SOURCE_ENCODING_IBM_862,
236 "IBM862", N_("Hebrew")("Hebrew") },
237 { CTK_SOURCE_ENCODING_IBM_864,
238 "IBM864", N_("Arabic")("Arabic") },
239
240 { CTK_SOURCE_ENCODING_ISO_2022_JP,
241 "ISO-2022-JP", N_("Japanese")("Japanese") },
242 { CTK_SOURCE_ENCODING_ISO_2022_KR,
243 "ISO-2022-KR", N_("Korean")("Korean") },
244 { CTK_SOURCE_ENCODING_ISO_IR_111,
245 "ISO-IR-111", N_("Cyrillic")("Cyrillic") },
246 { CTK_SOURCE_ENCODING_JOHAB,
247 "JOHAB", N_("Korean")("Korean") },
248 { CTK_SOURCE_ENCODING_KOI8_R,
249 "KOI8R", N_("Cyrillic")("Cyrillic") },
250 { CTK_SOURCE_ENCODING_KOI8__R,
251 "KOI8-R", N_("Cyrillic")("Cyrillic") },
252 { CTK_SOURCE_ENCODING_KOI8_U,
253 "KOI8U", N_("Cyrillic/Ukrainian")("Cyrillic/Ukrainian") },
254
255 { CTK_SOURCE_ENCODING_SHIFT_JIS,
256 "SHIFT_JIS", N_("Japanese")("Japanese") },
257 { CTK_SOURCE_ENCODING_TCVN,
258 "TCVN", N_("Vietnamese")("Vietnamese") },
259 { CTK_SOURCE_ENCODING_TIS_620,
260 "TIS-620", N_("Thai")("Thai") },
261 { CTK_SOURCE_ENCODING_UHC,
262 "UHC", N_("Korean")("Korean") },
263 { CTK_SOURCE_ENCODING_VISCII,
264 "VISCII", N_("Vietnamese")("Vietnamese") },
265
266 { CTK_SOURCE_ENCODING_WINDOWS_1250,
267 "WINDOWS-1250", N_("Central European")("Central European") },
268 { CTK_SOURCE_ENCODING_WINDOWS_1251,
269 "WINDOWS-1251", N_("Cyrillic")("Cyrillic") },
270 { CTK_SOURCE_ENCODING_WINDOWS_1252,
271 "WINDOWS-1252", N_("Western")("Western") },
272 { CTK_SOURCE_ENCODING_WINDOWS_1253,
273 "WINDOWS-1253", N_("Greek")("Greek") },
274 { CTK_SOURCE_ENCODING_WINDOWS_1254,
275 "WINDOWS-1254", N_("Turkish")("Turkish") },
276 { CTK_SOURCE_ENCODING_WINDOWS_1255,
277 "WINDOWS-1255", N_("Hebrew")("Hebrew") },
278 { CTK_SOURCE_ENCODING_WINDOWS_1256,
279 "WINDOWS-1256", N_("Arabic")("Arabic") },
280 { CTK_SOURCE_ENCODING_WINDOWS_1257,
281 "WINDOWS-1257", N_("Baltic")("Baltic") },
282 { CTK_SOURCE_ENCODING_WINDOWS_1258,
283 "WINDOWS-1258", N_("Vietnamese")("Vietnamese") }
284};
285
286static void
287ctk_source_encoding_lazy_init (void)
288{
289 static gboolean initialized = FALSE(0);
290 const gchar *locale_charset;
291
292 if (G_LIKELY (initialized)(__builtin_expect (__extension__ ({ int _g_boolean_var_21 = 0
; if (initialized) _g_boolean_var_21 = 1; _g_boolean_var_21; }
), 1))
)
293 {
294 return;
295 }
296
297 if (g_get_charset (&locale_charset) == FALSE(0))
298 {
299 unknown_encoding.charset = g_strdup (locale_charset)g_strdup_inline (locale_charset);
300 }
301
302 initialized = TRUE(!(0));
303}
304
305/**
306 * ctk_source_encoding_get_from_charset:
307 * @charset: a character set.
308 *
309 * Gets a #CtkSourceEncoding from a character set such as "UTF-8" or
310 * "ISO-8859-1".
311 *
312 * Returns: (nullable): the corresponding #CtkSourceEncoding, or %NULL
313 * if not found.
314 * Since: 3.14
315 */
316const CtkSourceEncoding *
317ctk_source_encoding_get_from_charset (const gchar *charset)
318{
319 gint i;
320
321 g_return_val_if_fail (charset != NULL, NULL)do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_22
= 0; if (charset != ((void*)0)) _g_boolean_var_22 = 1; _g_boolean_var_22
; }), 1))) { } else { g_return_if_fail_warning ("CtkSourceView"
, ((const char*) (__func__)), "charset != NULL"); return (((void
*)0)); } } while (0)
;
322
323 if (g_ascii_strcasecmp (charset, "UTF-8") == 0)
324 {
325 return ctk_source_encoding_get_utf8 ();
326 }
327
328 for (i = 0; i < CTK_SOURCE_ENCODING_LAST; i++)
329 {
330 if (g_ascii_strcasecmp (charset, encodings[i].charset) == 0)
331 {
332 return &encodings[i];
333 }
334 }
335
336 ctk_source_encoding_lazy_init ();
337
338 if (unknown_encoding.charset != NULL((void*)0) &&
339 g_ascii_strcasecmp (charset, unknown_encoding.charset) == 0)
340 {
341 return &unknown_encoding;
342 }
343
344 return NULL((void*)0);
345}
346
347/**
348 * ctk_source_encoding_get_all:
349 *
350 * Gets all encodings.
351 *
352 * Returns: (transfer container) (element-type CtkSource.Encoding): a list of
353 * all #CtkSourceEncoding's. Free with g_slist_free().
354 * Since: 3.14
355 */
356GSList *
357ctk_source_encoding_get_all (void)
358{
359 GSList *all = NULL((void*)0);
360 gint i;
361
362 for (i = CTK_SOURCE_ENCODING_LAST - 1; i >= 0; i--)
363 {
364 all = g_slist_prepend (all, (gpointer) &encodings[i]);
365 }
366
367 all = g_slist_prepend (all, (gpointer) &utf8_encoding);
368
369 return all;
370}
371
372/**
373 * ctk_source_encoding_get_utf8:
374 *
375 * Returns: the UTF-8 encoding.
376 * Since: 3.14
377 */
378const CtkSourceEncoding *
379ctk_source_encoding_get_utf8 (void)
380{
381 return &utf8_encoding;
382}
383
384/**
385 * ctk_source_encoding_get_current:
386 *
387 * Gets the #CtkSourceEncoding for the current locale. See also g_get_charset().
388 *
389 * Returns: the current locale encoding.
390 * Since: 3.14
391 */
392const CtkSourceEncoding *
393ctk_source_encoding_get_current (void)
394{
395 static gboolean initialized = FALSE(0);
396 static const CtkSourceEncoding *locale_encoding = NULL((void*)0);
397
398 const gchar *locale_charset;
399
400 ctk_source_encoding_lazy_init ();
401
402 if (G_LIKELY (initialized)(__builtin_expect (__extension__ ({ int _g_boolean_var_23 = 0
; if (initialized) _g_boolean_var_23 = 1; _g_boolean_var_23; }
), 1))
)
403 {
404 return locale_encoding;
405 }
406
407 if (g_get_charset (&locale_charset))
408 {
409 locale_encoding = &utf8_encoding;
410 }
411 else
412 {
413 locale_encoding = ctk_source_encoding_get_from_charset (locale_charset);
414 }
415
416 if (locale_encoding == NULL((void*)0))
417 {
418 locale_encoding = &unknown_encoding;
419 }
420
421 initialized = TRUE(!(0));
422
423 return locale_encoding;
424}
425
426/**
427 * ctk_source_encoding_to_string:
428 * @enc: a #CtkSourceEncoding.
429 *
430 * Returns: a string representation. Free with g_free() when no longer needed.
431 * Since: 3.14
432 */
433gchar *
434ctk_source_encoding_to_string (const CtkSourceEncoding* enc)
435{
436 g_return_val_if_fail (enc != NULL, NULL)do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_24
= 0; if (enc != ((void*)0)) _g_boolean_var_24 = 1; _g_boolean_var_24
; }), 1))) { } else { g_return_if_fail_warning ("CtkSourceView"
, ((const char*) (__func__)), "enc != NULL"); return (((void*
)0)); } } while (0)
;
437
438 ctk_source_encoding_lazy_init ();
439
440 g_return_val_if_fail (enc->charset != NULL, NULL)do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_25
= 0; if (enc->charset != ((void*)0)) _g_boolean_var_25 = 1
; _g_boolean_var_25; }), 1))) { } else { g_return_if_fail_warning
("CtkSourceView", ((const char*) (__func__)), "enc->charset != NULL"
); return (((void*)0)); } } while (0)
;
441
442 if (enc->name != NULL((void*)0))
443 {
444 return g_strdup_printf ("%s (%s)", _(enc->name)((char *) g_dgettext ("ctksourceview-4", enc->name)), enc->charset);
445 }
446 else if (g_ascii_strcasecmp (enc->charset, "ANSI_X3.4-1968") == 0)
447 {
448 return g_strdup_printf ("US-ASCII (%s)", enc->charset);
449 }
450 else
451 {
452 return g_strdup (enc->charset)g_strdup_inline (enc->charset);
453 }
454}
455
456/**
457 * ctk_source_encoding_get_charset:
458 * @enc: a #CtkSourceEncoding.
459 *
460 * Gets the character set of the #CtkSourceEncoding, such as "UTF-8" or
461 * "ISO-8859-1".
462 *
463 * Returns: the character set of the #CtkSourceEncoding.
464 * Since: 3.14
465 */
466const gchar *
467ctk_source_encoding_get_charset (const CtkSourceEncoding* enc)
468{
469 g_return_val_if_fail (enc != NULL, NULL)do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_26
= 0; if (enc != ((void*)0)) _g_boolean_var_26 = 1; _g_boolean_var_26
; }), 1))) { } else { g_return_if_fail_warning ("CtkSourceView"
, ((const char*) (__func__)), "enc != NULL"); return (((void*
)0)); } } while (0)
;
470
471 ctk_source_encoding_lazy_init ();
472
473 g_return_val_if_fail (enc->charset != NULL, NULL)do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_27
= 0; if (enc->charset != ((void*)0)) _g_boolean_var_27 = 1
; _g_boolean_var_27; }), 1))) { } else { g_return_if_fail_warning
("CtkSourceView", ((const char*) (__func__)), "enc->charset != NULL"
); return (((void*)0)); } } while (0)
;
474
475 return enc->charset;
476}
477
478/**
479 * ctk_source_encoding_get_name:
480 * @enc: a #CtkSourceEncoding.
481 *
482 * Gets the name of the #CtkSourceEncoding such as "Unicode" or "Western".
483 *
484 * Returns: the name of the #CtkSourceEncoding.
485 * Since: 3.14
486 */
487const gchar *
488ctk_source_encoding_get_name (const CtkSourceEncoding* enc)
489{
490 g_return_val_if_fail (enc != NULL, NULL)do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_28
= 0; if (enc != ((void*)0)) _g_boolean_var_28 = 1; _g_boolean_var_28
; }), 1))) { } else { g_return_if_fail_warning ("CtkSourceView"
, ((const char*) (__func__)), "enc != NULL"); return (((void*
)0)); } } while (0)
;
491
492 ctk_source_encoding_lazy_init ();
493
494 return (enc->name == NULL((void*)0)) ? _("Unknown")((char *) g_dgettext ("ctksourceview-4", "Unknown")) : _(enc->name)((char *) g_dgettext ("ctksourceview-4", enc->name));
495}
496
497static GSList *
498strv_to_list (const gchar * const *enc_str)
499{
500 GSList *res = NULL((void*)0);
501 gchar **p;
502
503 for (p = (gchar **)enc_str; p != NULL((void*)0) && *p != NULL((void*)0); p++)
504 {
505 const gchar *charset = *p;
506 const CtkSourceEncoding *enc;
507
508 if (g_str_equal (charset, "CURRENT")(strcmp ((const char *) (charset), (const char *) ("CURRENT")
) == 0)
)
509 {
510 g_get_charset (&charset);
511 }
512
513 g_return_val_if_fail (charset != NULL, NULL)do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_29
= 0; if (charset != ((void*)0)) _g_boolean_var_29 = 1; _g_boolean_var_29
; }), 1))) { } else { g_return_if_fail_warning ("CtkSourceView"
, ((const char*) (__func__)), "charset != NULL"); return (((void
*)0)); } } while (0)
;
514 enc = ctk_source_encoding_get_from_charset (charset);
515
516 if (enc != NULL((void*)0) &&
517 g_slist_find (res, enc) == NULL((void*)0))
518 {
519 res = g_slist_prepend (res, (gpointer)enc);
520 }
521 }
522
523 return g_slist_reverse (res);
524}
525
526static GSList *
527remove_duplicates_keep_first (GSList *list)
528{
529 GSList *new_list = NULL((void*)0);
530 GSList *l;
531
532 for (l = list; l != NULL((void*)0); l = l->next)
533 {
534 gpointer cur_encoding = l->data;
535
536 if (g_slist_find (new_list, cur_encoding) == NULL((void*)0))
537 {
538 new_list = g_slist_prepend (new_list, cur_encoding);
539 }
540 }
541
542 new_list = g_slist_reverse (new_list);
543
544 g_slist_free (list);
545 return new_list;
546}
547
548static GSList *
549remove_duplicates_keep_last (GSList *list)
550{
551 GSList *new_list = NULL((void*)0);
552 GSList *l;
553
554 list = g_slist_reverse (list);
555
556 for (l = list; l != NULL((void*)0); l = l->next)
557 {
558 gpointer cur_encoding = l->data;
559
560 if (g_slist_find (new_list, cur_encoding) == NULL((void*)0))
561 {
562 new_list = g_slist_prepend (new_list, cur_encoding);
563 }
564 }
565
566 g_slist_free (list);
567 return new_list;
568}
569
570/*
571 * _ctk_source_encoding_remove_duplicates:
572 * @list: (element-type CtkSource.Encoding): a list of #CtkSourceEncoding's.
573 * @removal_type: the #CtkSourceEncodingDuplicates.
574 *
575 * A convenience function to remove duplicated encodings in a list.
576 *
577 * Returns: (transfer container) (element-type CtkSource.Encoding): the new
578 * start of the #GSList.
579 * Since: 3.14
580 */
581GSList *
582_ctk_source_encoding_remove_duplicates (GSList *list,
583 CtkSourceEncodingDuplicates removal_type)
584{
585 switch (removal_type)
586 {
587 case CTK_SOURCE_ENCODING_DUPLICATES_KEEP_FIRST:
588 return remove_duplicates_keep_first (list);
589
590 case CTK_SOURCE_ENCODING_DUPLICATES_KEEP_LAST:
591 return remove_duplicates_keep_last (list);
592
593 default:
594 break;
595 }
596
597 g_return_val_if_reached (list)do { g_log ("CtkSourceView", G_LOG_LEVEL_CRITICAL, "file %s: line %d (%s): should not be reached"
, "../ctksourceview/ctksourceencoding.c", 597, ((const char*)
(__func__))); return (list); } while (0)
;
598}
599
600/**
601 * ctk_source_encoding_get_default_candidates:
602 *
603 * Gets the list of default candidate encodings to try when loading a file. See
604 * ctk_source_file_loader_set_candidate_encodings().
605 *
606 * This function returns a different list depending on the current locale (i.e.
607 * language, country and default encoding). The UTF-8 encoding and the current
608 * locale encoding are guaranteed to be present in the returned list.
609 *
610 * Returns: (transfer container) (element-type CtkSource.Encoding): the list of
611 * default candidate encodings. Free with g_slist_free().
612 * Since: 3.18
613 */
614GSList *
615ctk_source_encoding_get_default_candidates (void)
616{
617 const gchar *encodings_str;
618 const gchar *encodings_str_translated;
619 GVariant *encodings_variant;
620 const gchar **encodings_strv;
621 GSList *encodings_list;
622 GError *error = NULL((void*)0);
623
624 /* Translators: This is the sorted list of encodings used by
625 * CtkSourceView for automatic detection of the file encoding. You may
626 * want to customize it adding encodings that are common in your
627 * country, for instance the GB18030 encoding for the Chinese
628 * translation. You may also want to remove the ISO-8859-15 encoding
629 * (covering English and most Western European languages) if you think
630 * people in your country will rarely use it. "CURRENT" is a magic
631 * value used by CtkSourceView and it represents the encoding for the
632 * current locale, so please don't translate the "CURRENT" term. Only
633 * recognized encodings are used. See
634 * https://gitlab.gnome.org/GNOME/ctksourceview/blob/master/ctksourceview/ctksourceencoding.c#L142
635 * for a list of supported encodings.
636 * Keep the same format: square brackets, single quotes, commas.
637 */
638 encodings_str = N_("['UTF-8', 'CURRENT', 'ISO-8859-15', 'UTF-16']")("['UTF-8', 'CURRENT', 'ISO-8859-15', 'UTF-16']");
639
640 encodings_str_translated = _(encodings_str)((char *) g_dgettext ("ctksourceview-4", encodings_str));
641
642 encodings_variant = g_variant_parse (G_VARIANT_TYPE_STRING_ARRAY((const GVariantType *) "as"),
643 encodings_str_translated,
644 NULL((void*)0),
645 NULL((void*)0),
646 &error);
647
648 if (error != NULL((void*)0))
649 {
650 const gchar * const *language_names = g_get_language_names ();
651
652 g_warning ("Error while parsing encodings list for locale %s:\n"
653 "Translated list: %s\n"
654 "Error message: %s",
655 language_names[0],
656 encodings_str_translated,
657 error->message);
658
659 g_clear_error (&error);
660
661 encodings_variant = g_variant_parse (G_VARIANT_TYPE_STRING_ARRAY((const GVariantType *) "as"),
Casting a non-structure type to a structure type and accessing a field can lead to memory access errors or data corruption
662 encodings_str,
663 NULL((void*)0),
664 NULL((void*)0),
665 &error);
666
667 g_assert_no_error (error)do { if (error) g_assertion_message_error ("CtkSourceView", "../ctksourceview/ctksourceencoding.c"
, 667, ((const char*) (__func__)), "error", error, 0, 0); } while
(0)
;
668 }
669
670 encodings_strv = g_variant_get_strv (encodings_variant, NULL((void*)0));
671 encodings_list = strv_to_list (encodings_strv);
672 g_free ((gpointer) encodings_strv);
673
674 /* Ensure that UTF-8 and CURRENT are present. */
675 encodings_list = g_slist_prepend (encodings_list,
676 (gpointer) ctk_source_encoding_get_current ());
677
678 encodings_list = g_slist_prepend (encodings_list,
679 (gpointer) &utf8_encoding);
680
681 encodings_list = _ctk_source_encoding_remove_duplicates (encodings_list,
682 CTK_SOURCE_ENCODING_DUPLICATES_KEEP_LAST);
683
684 g_variant_unref (encodings_variant);
685 return encodings_list;
686}
687
688/**
689 * ctk_source_encoding_copy:
690 * @enc: a #CtkSourceEncoding.
691 *
692 * Used by language bindings.
693 *
694 * Returns: a copy of @enc.
695 * Since: 3.14
696 */
697CtkSourceEncoding *
698ctk_source_encoding_copy (const CtkSourceEncoding *enc)
699{
700 g_return_val_if_fail (enc != NULL, NULL)do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_30
= 0; if (enc != ((void*)0)) _g_boolean_var_30 = 1; _g_boolean_var_30
; }), 1))) { } else { g_return_if_fail_warning ("CtkSourceView"
, ((const char*) (__func__)), "enc != NULL"); return (((void*
)0)); } } while (0)
;
701
702 return (CtkSourceEncoding *) enc;
703}
704
705/**
706 * ctk_source_encoding_free:
707 * @enc: a #CtkSourceEncoding.
708 *
709 * Used by language bindings.
710 *
711 * Since: 3.14
712 */
713void
714ctk_source_encoding_free (CtkSourceEncoding *enc)
715{
716 g_return_if_fail (enc != NULL)do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_31
= 0; if (enc != ((void*)0)) _g_boolean_var_31 = 1; _g_boolean_var_31
; }), 1))) { } else { g_return_if_fail_warning ("CtkSourceView"
, ((const char*) (__func__)), "enc != NULL"); return; } } while
(0)
;
717}