Coverage Report

Created: 2025-10-13 06:31

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/glib/glib/gstrfuncs.c
Line
Count
Source
1
/* GLIB - Library of useful routines for C programming
2
 * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
3
 *
4
 * This library is free software; you can redistribute it and/or
5
 * modify it under the terms of the GNU Lesser General Public
6
 * License as published by the Free Software Foundation; either
7
 * version 2.1 of the License, or (at your option) any later version.
8
 *
9
 * This library is distributed in the hope that it will be useful,
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12
 * Lesser General Public License for more details.
13
 *
14
 * You should have received a copy of the GNU Lesser General Public
15
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
16
 */
17
18
/*
19
 * Modified by the GLib Team and others 1997-2000.  See the AUTHORS
20
 * file for a list of people on the GLib Team.  See the ChangeLog
21
 * files for a list of changes.  These files are distributed with
22
 * GLib at ftp://ftp.gtk.org/pub/gtk/.
23
 */
24
25
/*
26
 * MT safe
27
 */
28
29
#include "config.h"
30
31
#include <stdarg.h>
32
#include <stdio.h>
33
#include <stdlib.h>
34
#include <locale.h>
35
#include <string.h>
36
#include <locale.h>
37
#include <errno.h>
38
#include <garray.h>
39
#include <ctype.h>              /* For tolower() */
40
41
#ifdef HAVE_XLOCALE_H
42
/* Needed on BSD/OS X for e.g. strtod_l */
43
#include <xlocale.h>
44
#endif
45
46
#ifdef G_OS_WIN32
47
#include <windows.h>
48
#endif
49
50
/* do not include <unistd.h> here, it may interfere with g_strsignal() */
51
52
#include "gstrfuncs.h"
53
54
#include "gprintf.h"
55
#include "gprintfint.h"
56
#include "glibintl.h"
57
58
59
/**
60
 * SECTION:string_utils
61
 * @title: String Utility Functions
62
 * @short_description: various string-related functions
63
 *
64
 * This section describes a number of utility functions for creating,
65
 * duplicating, and manipulating strings.
66
 *
67
 * Note that the functions g_printf(), g_fprintf(), g_sprintf(),
68
 * g_vprintf(), g_vfprintf(), g_vsprintf() and g_vasprintf()
69
 * are declared in the header `gprintf.h` which is not included in `glib.h`
70
 * (otherwise using `glib.h` would drag in `stdio.h`), so you'll have to
71
 * explicitly include `<glib/gprintf.h>` in order to use the GLib
72
 * printf() functions.
73
 *
74
 * ## String precision pitfalls # {#string-precision}
75
 *
76
 * While you may use the printf() functions to format UTF-8 strings,
77
 * notice that the precision of a \%Ns parameter is interpreted
78
 * as the number of bytes, not characters to print. On top of that,
79
 * the GNU libc implementation of the printf() functions has the
80
 * "feature" that it checks that the string given for the \%Ns
81
 * parameter consists of a whole number of characters in the current
82
 * encoding. So, unless you are sure you are always going to be in an
83
 * UTF-8 locale or your know your text is restricted to ASCII, avoid
84
 * using \%Ns. If your intention is to format strings for a
85
 * certain number of columns, then \%Ns is not a correct solution
86
 * anyway, since it fails to take wide characters (see g_unichar_iswide())
87
 * into account.
88
 *
89
 * Note also that there are various printf() parameters which are platform
90
 * dependent. GLib provides platform independent macros for these parameters
91
 * which should be used instead. A common example is %G_GUINT64_FORMAT, which
92
 * should be used instead of `%llu` or similar parameters for formatting
93
 * 64-bit integers. These macros are all named `G_*_FORMAT`; see
94
 * [Basic Types][glib-Basic-Types].
95
 */
96
97
/**
98
 * g_ascii_isalnum:
99
 * @c: any character
100
 *
101
 * Determines whether a character is alphanumeric.
102
 *
103
 * Unlike the standard C library isalnum() function, this only
104
 * recognizes standard ASCII letters and ignores the locale,
105
 * returning %FALSE for all non-ASCII characters. Also, unlike
106
 * the standard library function, this takes a char, not an int,
107
 * so don't call it on %EOF, but no need to cast to #guchar before
108
 * passing a possibly non-ASCII character in.
109
 *
110
 * Returns: %TRUE if @c is an ASCII alphanumeric character
111
 */
112
113
/**
114
 * g_ascii_isalpha:
115
 * @c: any character
116
 *
117
 * Determines whether a character is alphabetic (i.e. a letter).
118
 *
119
 * Unlike the standard C library isalpha() function, this only
120
 * recognizes standard ASCII letters and ignores the locale,
121
 * returning %FALSE for all non-ASCII characters. Also, unlike
122
 * the standard library function, this takes a char, not an int,
123
 * so don't call it on %EOF, but no need to cast to #guchar before
124
 * passing a possibly non-ASCII character in.
125
 *
126
 * Returns: %TRUE if @c is an ASCII alphabetic character
127
 */
128
129
/**
130
 * g_ascii_iscntrl:
131
 * @c: any character
132
 *
133
 * Determines whether a character is a control character.
134
 *
135
 * Unlike the standard C library iscntrl() function, this only
136
 * recognizes standard ASCII control characters and ignores the
137
 * locale, returning %FALSE for all non-ASCII characters. Also,
138
 * unlike the standard library function, this takes a char, not
139
 * an int, so don't call it on %EOF, but no need to cast to #guchar
140
 * before passing a possibly non-ASCII character in.
141
 *
142
 * Returns: %TRUE if @c is an ASCII control character.
143
 */
144
145
/**
146
 * g_ascii_isdigit:
147
 * @c: any character
148
 *
149
 * Determines whether a character is digit (0-9).
150
 *
151
 * Unlike the standard C library isdigit() function, this takes
152
 * a char, not an int, so don't call it  on %EOF, but no need to
153
 * cast to #guchar before passing a possibly non-ASCII character in.
154
 *
155
 * Returns: %TRUE if @c is an ASCII digit.
156
 */
157
158
/**
159
 * g_ascii_isgraph:
160
 * @c: any character
161
 *
162
 * Determines whether a character is a printing character and not a space.
163
 *
164
 * Unlike the standard C library isgraph() function, this only
165
 * recognizes standard ASCII characters and ignores the locale,
166
 * returning %FALSE for all non-ASCII characters. Also, unlike
167
 * the standard library function, this takes a char, not an int,
168
 * so don't call it on %EOF, but no need to cast to #guchar before
169
 * passing a possibly non-ASCII character in.
170
 *
171
 * Returns: %TRUE if @c is an ASCII printing character other than space.
172
 */
173
174
/**
175
 * g_ascii_islower:
176
 * @c: any character
177
 *
178
 * Determines whether a character is an ASCII lower case letter.
179
 *
180
 * Unlike the standard C library islower() function, this only
181
 * recognizes standard ASCII letters and ignores the locale,
182
 * returning %FALSE for all non-ASCII characters. Also, unlike
183
 * the standard library function, this takes a char, not an int,
184
 * so don't call it on %EOF, but no need to worry about casting
185
 * to #guchar before passing a possibly non-ASCII character in.
186
 *
187
 * Returns: %TRUE if @c is an ASCII lower case letter
188
 */
189
190
/**
191
 * g_ascii_isprint:
192
 * @c: any character
193
 *
194
 * Determines whether a character is a printing character.
195
 *
196
 * Unlike the standard C library isprint() function, this only
197
 * recognizes standard ASCII characters and ignores the locale,
198
 * returning %FALSE for all non-ASCII characters. Also, unlike
199
 * the standard library function, this takes a char, not an int,
200
 * so don't call it on %EOF, but no need to cast to #guchar before
201
 * passing a possibly non-ASCII character in.
202
 *
203
 * Returns: %TRUE if @c is an ASCII printing character.
204
 */
205
206
/**
207
 * g_ascii_ispunct:
208
 * @c: any character
209
 *
210
 * Determines whether a character is a punctuation character.
211
 *
212
 * Unlike the standard C library ispunct() function, this only
213
 * recognizes standard ASCII letters and ignores the locale,
214
 * returning %FALSE for all non-ASCII characters. Also, unlike
215
 * the standard library function, this takes a char, not an int,
216
 * so don't call it on %EOF, but no need to cast to #guchar before
217
 * passing a possibly non-ASCII character in.
218
 *
219
 * Returns: %TRUE if @c is an ASCII punctuation character.
220
 */
221
222
/**
223
 * g_ascii_isspace:
224
 * @c: any character
225
 *
226
 * Determines whether a character is a white-space character.
227
 *
228
 * Unlike the standard C library isspace() function, this only
229
 * recognizes standard ASCII white-space and ignores the locale,
230
 * returning %FALSE for all non-ASCII characters. Also, unlike
231
 * the standard library function, this takes a char, not an int,
232
 * so don't call it on %EOF, but no need to cast to #guchar before
233
 * passing a possibly non-ASCII character in.
234
 *
235
 * Returns: %TRUE if @c is an ASCII white-space character
236
 */
237
238
/**
239
 * g_ascii_isupper:
240
 * @c: any character
241
 *
242
 * Determines whether a character is an ASCII upper case letter.
243
 *
244
 * Unlike the standard C library isupper() function, this only
245
 * recognizes standard ASCII letters and ignores the locale,
246
 * returning %FALSE for all non-ASCII characters. Also, unlike
247
 * the standard library function, this takes a char, not an int,
248
 * so don't call it on %EOF, but no need to worry about casting
249
 * to #guchar before passing a possibly non-ASCII character in.
250
 *
251
 * Returns: %TRUE if @c is an ASCII upper case letter
252
 */
253
254
/**
255
 * g_ascii_isxdigit:
256
 * @c: any character
257
 *
258
 * Determines whether a character is a hexadecimal-digit character.
259
 *
260
 * Unlike the standard C library isxdigit() function, this takes
261
 * a char, not an int, so don't call it on %EOF, but no need to
262
 * cast to #guchar before passing a possibly non-ASCII character in.
263
 *
264
 * Returns: %TRUE if @c is an ASCII hexadecimal-digit character.
265
 */
266
267
/**
268
 * G_ASCII_DTOSTR_BUF_SIZE:
269
 *
270
 * A good size for a buffer to be passed into g_ascii_dtostr().
271
 * It is guaranteed to be enough for all output of that function
272
 * on systems with 64bit IEEE-compatible doubles.
273
 *
274
 * The typical usage would be something like:
275
 * |[<!-- language="C" --> 
276
 *   char buf[G_ASCII_DTOSTR_BUF_SIZE];
277
 *
278
 *   fprintf (out, "value=%s\n", g_ascii_dtostr (buf, sizeof (buf), value));
279
 * ]|
280
 */
281
282
/**
283
 * g_strstrip:
284
 * @string: a string to remove the leading and trailing whitespace from
285
 *
286
 * Removes leading and trailing whitespace from a string.
287
 * See g_strchomp() and g_strchug().
288
 *
289
 * Returns: @string
290
 */
291
292
/**
293
 * G_STR_DELIMITERS:
294
 *
295
 * The standard delimiters, used in g_strdelimit().
296
 */
297
298
static const guint16 ascii_table_data[256] = {
299
  0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004,
300
  0x004, 0x104, 0x104, 0x004, 0x104, 0x104, 0x004, 0x004,
301
  0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004,
302
  0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004,
303
  0x140, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0,
304
  0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0,
305
  0x459, 0x459, 0x459, 0x459, 0x459, 0x459, 0x459, 0x459,
306
  0x459, 0x459, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0,
307
  0x0d0, 0x653, 0x653, 0x653, 0x653, 0x653, 0x653, 0x253,
308
  0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253,
309
  0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253,
310
  0x253, 0x253, 0x253, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0,
311
  0x0d0, 0x473, 0x473, 0x473, 0x473, 0x473, 0x473, 0x073,
312
  0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073,
313
  0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073,
314
  0x073, 0x073, 0x073, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x004
315
  /* the upper 128 are all zeroes */
316
};
317
318
const guint16 * const g_ascii_table = ascii_table_data;
319
320
#if defined (HAVE_NEWLOCALE) && \
321
    defined (HAVE_USELOCALE) && \
322
    defined (HAVE_STRTOD_L) && \
323
    defined (HAVE_STRTOULL_L) && \
324
    defined (HAVE_STRTOLL_L)
325
#define USE_XLOCALE 1
326
#endif
327
328
#ifdef USE_XLOCALE
329
static locale_t
330
get_C_locale (void)
331
12.4M
{
332
12.4M
  static gsize initialized = FALSE;
333
12.4M
  static locale_t C_locale = NULL;
334
335
12.4M
  if (g_once_init_enter (&initialized))
336
11
    {
337
11
      C_locale = newlocale (LC_ALL_MASK, "C", NULL);
338
11
      g_once_init_leave (&initialized, TRUE);
339
11
    }
340
341
12.4M
  return C_locale;
342
12.4M
}
343
#endif
344
345
/**
346
 * g_strdup:
347
 * @str: (nullable): the string to duplicate
348
 *
349
 * Duplicates a string. If @str is %NULL it returns %NULL.
350
 * The returned string should be freed with g_free()
351
 * when no longer needed.
352
 *
353
 * Returns: a newly-allocated copy of @str
354
 */
355
gchar*
356
g_strdup (const gchar *str)
357
14.4M
{
358
14.4M
  gchar *new_str;
359
14.4M
  gsize length;
360
361
14.4M
  if (str)
362
14.4M
    {
363
14.4M
      length = strlen (str) + 1;
364
14.4M
      new_str = g_new (char, length);
365
14.4M
      memcpy (new_str, str, length);
366
14.4M
    }
367
608
  else
368
608
    new_str = NULL;
369
370
14.4M
  return new_str;
371
14.4M
}
372
373
/**
374
 * g_memdup:
375
 * @mem: the memory to copy.
376
 * @byte_size: the number of bytes to copy.
377
 *
378
 * Allocates @byte_size bytes of memory, and copies @byte_size bytes into it
379
 * from @mem. If @mem is %NULL it returns %NULL.
380
 *
381
 * Returns: a pointer to the newly-allocated copy of the memory, or %NULL if @mem
382
 *  is %NULL.
383
 * Deprecated: 2.68: Use g_memdup2() instead, as it accepts a #gsize argument
384
 *     for @byte_size, avoiding the possibility of overflow in a #gsize → #guint
385
 *     conversion
386
 */
387
gpointer
388
g_memdup (gconstpointer mem,
389
          guint         byte_size)
390
0
{
391
0
  gpointer new_mem;
392
393
0
  if (mem && byte_size != 0)
394
0
    {
395
0
      new_mem = g_malloc (byte_size);
396
0
      memcpy (new_mem, mem, byte_size);
397
0
    }
398
0
  else
399
0
    new_mem = NULL;
400
401
0
  return new_mem;
402
0
}
403
404
/**
405
 * g_memdup2:
406
 * @mem: (nullable): the memory to copy.
407
 * @byte_size: the number of bytes to copy.
408
 *
409
 * Allocates @byte_size bytes of memory, and copies @byte_size bytes into it
410
 * from @mem. If @mem is %NULL it returns %NULL.
411
 *
412
 * This replaces g_memdup(), which was prone to integer overflows when
413
 * converting the argument from a #gsize to a #guint.
414
 *
415
 * Returns: (nullable): a pointer to the newly-allocated copy of the memory,
416
 *    or %NULL if @mem is %NULL.
417
 * Since: 2.68
418
 */
419
gpointer
420
g_memdup2 (gconstpointer mem,
421
           gsize         byte_size)
422
1.13M
{
423
1.13M
  gpointer new_mem;
424
425
1.13M
  if (mem && byte_size != 0)
426
403k
    {
427
403k
      new_mem = g_malloc (byte_size);
428
403k
      memcpy (new_mem, mem, byte_size);
429
403k
    }
430
733k
  else
431
733k
    new_mem = NULL;
432
433
1.13M
  return new_mem;
434
1.13M
}
435
436
/**
437
 * g_strndup:
438
 * @str: the string to duplicate
439
 * @n: the maximum number of bytes to copy from @str
440
 *
441
 * Duplicates the first @n bytes of a string, returning a newly-allocated
442
 * buffer @n + 1 bytes long which will always be nul-terminated. If @str
443
 * is less than @n bytes long the buffer is padded with nuls. If @str is
444
 * %NULL it returns %NULL. The returned value should be freed when no longer
445
 * needed.
446
 *
447
 * To copy a number of characters from a UTF-8 encoded string,
448
 * use g_utf8_strncpy() instead.
449
 *
450
 * Returns: a newly-allocated buffer containing the first @n bytes
451
 *     of @str, nul-terminated
452
 */
453
gchar*
454
g_strndup (const gchar *str,
455
           gsize        n)
456
2.57M
{
457
2.57M
  gchar *new_str;
458
459
2.57M
  if (str)
460
2.57M
    {
461
2.57M
      new_str = g_new (gchar, n + 1);
462
2.57M
      strncpy (new_str, str, n);
463
2.57M
      new_str[n] = '\0';
464
2.57M
    }
465
0
  else
466
0
    new_str = NULL;
467
468
2.57M
  return new_str;
469
2.57M
}
470
471
/**
472
 * g_strnfill:
473
 * @length: the length of the new string
474
 * @fill_char: the byte to fill the string with
475
 *
476
 * Creates a new string @length bytes long filled with @fill_char.
477
 * The returned string should be freed when no longer needed.
478
 *
479
 * Returns: a newly-allocated string filled the @fill_char
480
 */
481
gchar*
482
g_strnfill (gsize length,
483
            gchar fill_char)
484
0
{
485
0
  gchar *str;
486
487
0
  str = g_new (gchar, length + 1);
488
0
  memset (str, (guchar)fill_char, length);
489
0
  str[length] = '\0';
490
491
0
  return str;
492
0
}
493
494
/**
495
 * g_stpcpy:
496
 * @dest: destination buffer.
497
 * @src: source string.
498
 *
499
 * Copies a nul-terminated string into the dest buffer, include the
500
 * trailing nul, and return a pointer to the trailing nul byte.
501
 * This is useful for concatenating multiple strings together
502
 * without having to repeatedly scan for the end.
503
 *
504
 * Returns: a pointer to trailing nul byte.
505
 **/
506
gchar *
507
g_stpcpy (gchar       *dest,
508
          const gchar *src)
509
600k
{
510
600k
#ifdef HAVE_STPCPY
511
600k
  g_return_val_if_fail (dest != NULL, NULL);
512
600k
  g_return_val_if_fail (src != NULL, NULL);
513
600k
  return stpcpy (dest, src);
514
#else
515
  gchar *d = dest;
516
  const gchar *s = src;
517
518
  g_return_val_if_fail (dest != NULL, NULL);
519
  g_return_val_if_fail (src != NULL, NULL);
520
  do
521
    *d++ = *s;
522
  while (*s++ != '\0');
523
524
  return d - 1;
525
#endif
526
600k
}
527
528
/**
529
 * g_strdup_vprintf:
530
 * @format: (not nullable): a standard printf() format string, but notice
531
 *     [string precision pitfalls][string-precision]
532
 * @args: the list of parameters to insert into the format string
533
 *
534
 * Similar to the standard C vsprintf() function but safer, since it
535
 * calculates the maximum space required and allocates memory to hold
536
 * the result. The returned string should be freed with g_free() when
537
 * no longer needed.
538
 *
539
 * The returned string is guaranteed to be non-NULL, unless @format
540
 * contains `%lc` or `%ls` conversions, which can fail if no multibyte
541
 * representation is available for the given character.
542
 *
543
 * See also g_vasprintf(), which offers the same functionality, but
544
 * additionally returns the length of the allocated string.
545
 *
546
 * Returns: a newly-allocated string holding the result
547
 */
548
gchar*
549
g_strdup_vprintf (const gchar *format,
550
                  va_list      args)
551
4.89M
{
552
4.89M
  gchar *string = NULL;
553
554
4.89M
  g_vasprintf (&string, format, args);
555
556
4.89M
  return string;
557
4.89M
}
558
559
/**
560
 * g_strdup_printf:
561
 * @format: (not nullable): a standard printf() format string, but notice
562
 *     [string precision pitfalls][string-precision]
563
 * @...: the parameters to insert into the format string
564
 *
565
 * Similar to the standard C sprintf() function but safer, since it
566
 * calculates the maximum space required and allocates memory to hold
567
 * the result. The returned string should be freed with g_free() when no
568
 * longer needed.
569
 *
570
 * The returned string is guaranteed to be non-NULL, unless @format
571
 * contains `%lc` or `%ls` conversions, which can fail if no multibyte
572
 * representation is available for the given character.
573
 *
574
 * Returns: a newly-allocated string holding the result
575
 */
576
gchar*
577
g_strdup_printf (const gchar *format,
578
                 ...)
579
642k
{
580
642k
  gchar *buffer;
581
642k
  va_list args;
582
583
642k
  va_start (args, format);
584
642k
  buffer = g_strdup_vprintf (format, args);
585
642k
  va_end (args);
586
587
642k
  return buffer;
588
642k
}
589
590
/**
591
 * g_strconcat:
592
 * @string1: the first string to add, which must not be %NULL
593
 * @...: a %NULL-terminated list of strings to append to the string
594
 *
595
 * Concatenates all of the given strings into one long string. The
596
 * returned string should be freed with g_free() when no longer needed.
597
 *
598
 * The variable argument list must end with %NULL. If you forget the %NULL,
599
 * g_strconcat() will start appending random memory junk to your string.
600
 *
601
 * Note that this function is usually not the right function to use to
602
 * assemble a translated message from pieces, since proper translation
603
 * often requires the pieces to be reordered.
604
 *
605
 * Returns: a newly-allocated string containing all the string arguments
606
 */
607
gchar*
608
g_strconcat (const gchar *string1, ...)
609
45.8k
{
610
45.8k
  gsize   l;
611
45.8k
  va_list args;
612
45.8k
  gchar   *s;
613
45.8k
  gchar   *concat;
614
45.8k
  gchar   *ptr;
615
616
45.8k
  if (!string1)
617
0
    return NULL;
618
619
45.8k
  l = 1 + strlen (string1);
620
45.8k
  va_start (args, string1);
621
45.8k
  s = va_arg (args, gchar*);
622
91.6k
  while (s)
623
45.8k
    {
624
45.8k
      l += strlen (s);
625
45.8k
      s = va_arg (args, gchar*);
626
45.8k
    }
627
45.8k
  va_end (args);
628
629
45.8k
  concat = g_new (gchar, l);
630
45.8k
  ptr = concat;
631
632
45.8k
  ptr = g_stpcpy (ptr, string1);
633
45.8k
  va_start (args, string1);
634
45.8k
  s = va_arg (args, gchar*);
635
91.6k
  while (s)
636
45.8k
    {
637
45.8k
      ptr = g_stpcpy (ptr, s);
638
45.8k
      s = va_arg (args, gchar*);
639
45.8k
    }
640
45.8k
  va_end (args);
641
642
45.8k
  return concat;
643
45.8k
}
644
645
/**
646
 * g_strtod:
647
 * @nptr:    the string to convert to a numeric value.
648
 * @endptr:  (out) (transfer none) (optional): if non-%NULL, it returns the
649
 *           character after the last character used in the conversion.
650
 *
651
 * Converts a string to a #gdouble value.
652
 * It calls the standard strtod() function to handle the conversion, but
653
 * if the string is not completely converted it attempts the conversion
654
 * again with g_ascii_strtod(), and returns the best match.
655
 *
656
 * This function should seldom be used. The normal situation when reading
657
 * numbers not for human consumption is to use g_ascii_strtod(). Only when
658
 * you know that you must expect both locale formatted and C formatted numbers
659
 * should you use this. Make sure that you don't pass strings such as comma
660
 * separated lists of values, since the commas may be interpreted as a decimal
661
 * point in some locales, causing unexpected results.
662
 *
663
 * Returns: the #gdouble value.
664
 **/
665
gdouble
666
g_strtod (const gchar *nptr,
667
          gchar      **endptr)
668
0
{
669
0
  gchar *fail_pos_1;
670
0
  gchar *fail_pos_2;
671
0
  gdouble val_1;
672
0
  gdouble val_2 = 0;
673
674
0
  g_return_val_if_fail (nptr != NULL, 0);
675
676
0
  fail_pos_1 = NULL;
677
0
  fail_pos_2 = NULL;
678
679
0
  val_1 = strtod (nptr, &fail_pos_1);
680
681
0
  if (fail_pos_1 && fail_pos_1[0] != 0)
682
0
    val_2 = g_ascii_strtod (nptr, &fail_pos_2);
683
684
0
  if (!fail_pos_1 || fail_pos_1[0] == 0 || fail_pos_1 >= fail_pos_2)
685
0
    {
686
0
      if (endptr)
687
0
        *endptr = fail_pos_1;
688
0
      return val_1;
689
0
    }
690
0
  else
691
0
    {
692
0
      if (endptr)
693
0
        *endptr = fail_pos_2;
694
0
      return val_2;
695
0
    }
696
0
}
697
698
/**
699
 * g_ascii_strtod:
700
 * @nptr:    the string to convert to a numeric value.
701
 * @endptr:  (out) (transfer none) (optional): if non-%NULL, it returns the
702
 *           character after the last character used in the conversion.
703
 *
704
 * Converts a string to a #gdouble value.
705
 *
706
 * This function behaves like the standard strtod() function
707
 * does in the C locale. It does this without actually changing
708
 * the current locale, since that would not be thread-safe.
709
 * A limitation of the implementation is that this function
710
 * will still accept localized versions of infinities and NANs.
711
 *
712
 * This function is typically used when reading configuration
713
 * files or other non-user input that should be locale independent.
714
 * To handle input from the user you should normally use the
715
 * locale-sensitive system strtod() function.
716
 *
717
 * To convert from a #gdouble to a string in a locale-insensitive
718
 * way, use g_ascii_dtostr().
719
 *
720
 * If the correct value would cause overflow, plus or minus %HUGE_VAL
721
 * is returned (according to the sign of the value), and %ERANGE is
722
 * stored in %errno. If the correct value would cause underflow,
723
 * zero is returned and %ERANGE is stored in %errno.
724
 *
725
 * This function resets %errno before calling strtod() so that
726
 * you can reliably detect overflow and underflow.
727
 *
728
 * Returns: the #gdouble value.
729
 */
730
gdouble
731
g_ascii_strtod (const gchar *nptr,
732
                gchar      **endptr)
733
0
{
734
0
#ifdef USE_XLOCALE
735
736
0
  g_return_val_if_fail (nptr != NULL, 0);
737
738
0
  errno = 0;
739
740
0
  return strtod_l (nptr, endptr, get_C_locale ());
741
742
#else
743
744
  gchar *fail_pos;
745
  gdouble val;
746
#ifndef __BIONIC__
747
  struct lconv *locale_data;
748
#endif
749
  const char *decimal_point;
750
  gsize decimal_point_len;
751
  const char *p, *decimal_point_pos;
752
  const char *end = NULL; /* Silence gcc */
753
  int strtod_errno;
754
755
  g_return_val_if_fail (nptr != NULL, 0);
756
757
  fail_pos = NULL;
758
759
#ifndef __BIONIC__
760
  locale_data = localeconv ();
761
  decimal_point = locale_data->decimal_point;
762
  decimal_point_len = strlen (decimal_point);
763
#else
764
  decimal_point = ".";
765
  decimal_point_len = 1;
766
#endif
767
768
  g_assert (decimal_point_len != 0);
769
770
  decimal_point_pos = NULL;
771
  end = NULL;
772
773
  if (decimal_point[0] != '.' ||
774
      decimal_point[1] != 0)
775
    {
776
      p = nptr;
777
      /* Skip leading space */
778
      while (g_ascii_isspace (*p))
779
        p++;
780
781
      /* Skip leading optional sign */
782
      if (*p == '+' || *p == '-')
783
        p++;
784
785
      if (p[0] == '0' &&
786
          (p[1] == 'x' || p[1] == 'X'))
787
        {
788
          p += 2;
789
          /* HEX - find the (optional) decimal point */
790
791
          while (g_ascii_isxdigit (*p))
792
            p++;
793
794
          if (*p == '.')
795
            decimal_point_pos = p++;
796
797
          while (g_ascii_isxdigit (*p))
798
            p++;
799
800
          if (*p == 'p' || *p == 'P')
801
            p++;
802
          if (*p == '+' || *p == '-')
803
            p++;
804
          while (g_ascii_isdigit (*p))
805
            p++;
806
807
          end = p;
808
        }
809
      else if (g_ascii_isdigit (*p) || *p == '.')
810
        {
811
          while (g_ascii_isdigit (*p))
812
            p++;
813
814
          if (*p == '.')
815
            decimal_point_pos = p++;
816
817
          while (g_ascii_isdigit (*p))
818
            p++;
819
820
          if (*p == 'e' || *p == 'E')
821
            p++;
822
          if (*p == '+' || *p == '-')
823
            p++;
824
          while (g_ascii_isdigit (*p))
825
            p++;
826
827
          end = p;
828
        }
829
      /* For the other cases, we need not convert the decimal point */
830
    }
831
832
  if (decimal_point_pos)
833
    {
834
      char *copy, *c;
835
836
      /* We need to convert the '.' to the locale specific decimal point */
837
      copy = g_malloc (end - nptr + 1 + decimal_point_len);
838
839
      c = copy;
840
      memcpy (c, nptr, decimal_point_pos - nptr);
841
      c += decimal_point_pos - nptr;
842
      memcpy (c, decimal_point, decimal_point_len);
843
      c += decimal_point_len;
844
      memcpy (c, decimal_point_pos + 1, end - (decimal_point_pos + 1));
845
      c += end - (decimal_point_pos + 1);
846
      *c = 0;
847
848
      errno = 0;
849
      val = strtod (copy, &fail_pos);
850
      strtod_errno = errno;
851
852
      if (fail_pos)
853
        {
854
          if (fail_pos - copy > decimal_point_pos - nptr)
855
            fail_pos = (char *)nptr + (fail_pos - copy) - (decimal_point_len - 1);
856
          else
857
            fail_pos = (char *)nptr + (fail_pos - copy);
858
        }
859
860
      g_free (copy);
861
862
    }
863
  else if (end)
864
    {
865
      char *copy;
866
867
      copy = g_malloc (end - (char *)nptr + 1);
868
      memcpy (copy, nptr, end - nptr);
869
      *(copy + (end - (char *)nptr)) = 0;
870
871
      errno = 0;
872
      val = strtod (copy, &fail_pos);
873
      strtod_errno = errno;
874
875
      if (fail_pos)
876
        {
877
          fail_pos = (char *)nptr + (fail_pos - copy);
878
        }
879
880
      g_free (copy);
881
    }
882
  else
883
    {
884
      errno = 0;
885
      val = strtod (nptr, &fail_pos);
886
      strtod_errno = errno;
887
    }
888
889
  if (endptr)
890
    *endptr = fail_pos;
891
892
  errno = strtod_errno;
893
894
  return val;
895
#endif
896
0
}
897
898
899
/**
900
 * g_ascii_dtostr:
901
 * @buffer: A buffer to place the resulting string in
902
 * @buf_len: The length of the buffer.
903
 * @d: The #gdouble to convert
904
 *
905
 * Converts a #gdouble to a string, using the '.' as
906
 * decimal point.
907
 *
908
 * This function generates enough precision that converting
909
 * the string back using g_ascii_strtod() gives the same machine-number
910
 * (on machines with IEEE compatible 64bit doubles). It is
911
 * guaranteed that the size of the resulting string will never
912
 * be larger than @G_ASCII_DTOSTR_BUF_SIZE bytes, including the terminating
913
 * nul character, which is always added.
914
 *
915
 * Returns: The pointer to the buffer with the converted string.
916
 **/
917
gchar *
918
g_ascii_dtostr (gchar       *buffer,
919
                gint         buf_len,
920
                gdouble      d)
921
0
{
922
0
  return g_ascii_formatd (buffer, buf_len, "%.17g", d);
923
0
}
924
925
#pragma GCC diagnostic push
926
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
927
928
/**
929
 * g_ascii_formatd:
930
 * @buffer: A buffer to place the resulting string in
931
 * @buf_len: The length of the buffer.
932
 * @format: The printf()-style format to use for the
933
 *          code to use for converting.
934
 * @d: The #gdouble to convert
935
 *
936
 * Converts a #gdouble to a string, using the '.' as
937
 * decimal point. To format the number you pass in
938
 * a printf()-style format string. Allowed conversion
939
 * specifiers are 'e', 'E', 'f', 'F', 'g' and 'G'.
940
 *
941
 * The returned buffer is guaranteed to be nul-terminated.
942
 *
943
 * If you just want to want to serialize the value into a
944
 * string, use g_ascii_dtostr().
945
 *
946
 * Returns: The pointer to the buffer with the converted string.
947
 */
948
gchar *
949
g_ascii_formatd (gchar       *buffer,
950
                 gint         buf_len,
951
                 const gchar *format,
952
                 gdouble      d)
953
0
{
954
0
#ifdef USE_XLOCALE
955
0
  locale_t old_locale;
956
957
0
  old_locale = uselocale (get_C_locale ());
958
0
   _g_snprintf (buffer, buf_len, format, d);
959
0
  uselocale (old_locale);
960
961
0
  return buffer;
962
#else
963
#ifndef __BIONIC__
964
  struct lconv *locale_data;
965
#endif
966
  const char *decimal_point;
967
  gsize decimal_point_len;
968
  gchar *p;
969
  int rest_len;
970
  gchar format_char;
971
972
  g_return_val_if_fail (buffer != NULL, NULL);
973
  g_return_val_if_fail (format[0] == '%', NULL);
974
  g_return_val_if_fail (strpbrk (format + 1, "'l%") == NULL, NULL);
975
976
  format_char = format[strlen (format) - 1];
977
978
  g_return_val_if_fail (format_char == 'e' || format_char == 'E' ||
979
                        format_char == 'f' || format_char == 'F' ||
980
                        format_char == 'g' || format_char == 'G',
981
                        NULL);
982
983
  if (format[0] != '%')
984
    return NULL;
985
986
  if (strpbrk (format + 1, "'l%"))
987
    return NULL;
988
989
  if (!(format_char == 'e' || format_char == 'E' ||
990
        format_char == 'f' || format_char == 'F' ||
991
        format_char == 'g' || format_char == 'G'))
992
    return NULL;
993
994
  _g_snprintf (buffer, buf_len, format, d);
995
996
#ifndef __BIONIC__
997
  locale_data = localeconv ();
998
  decimal_point = locale_data->decimal_point;
999
  decimal_point_len = strlen (decimal_point);
1000
#else
1001
  decimal_point = ".";
1002
  decimal_point_len = 1;
1003
#endif
1004
1005
  g_assert (decimal_point_len != 0);
1006
1007
  if (decimal_point[0] != '.' ||
1008
      decimal_point[1] != 0)
1009
    {
1010
      p = buffer;
1011
1012
      while (g_ascii_isspace (*p))
1013
        p++;
1014
1015
      if (*p == '+' || *p == '-')
1016
        p++;
1017
1018
      while (isdigit ((guchar)*p))
1019
        p++;
1020
1021
      if (strncmp (p, decimal_point, decimal_point_len) == 0)
1022
        {
1023
          *p = '.';
1024
          p++;
1025
          if (decimal_point_len > 1)
1026
            {
1027
              rest_len = strlen (p + (decimal_point_len - 1));
1028
              memmove (p, p + (decimal_point_len - 1), rest_len);
1029
              p[rest_len] = 0;
1030
            }
1031
        }
1032
    }
1033
1034
  return buffer;
1035
#endif
1036
0
}
1037
#pragma GCC diagnostic pop
1038
1039
#define ISSPACE(c)              ((c) == ' ' || (c) == '\f' || (c) == '\n' || \
1040
                                 (c) == '\r' || (c) == '\t' || (c) == '\v')
1041
0
#define ISUPPER(c)              ((c) >= 'A' && (c) <= 'Z')
1042
#define ISLOWER(c)              ((c) >= 'a' && (c) <= 'z')
1043
#define ISALPHA(c)              (ISUPPER (c) || ISLOWER (c))
1044
#define TOUPPER(c)              (ISLOWER (c) ? (c) - 'a' + 'A' : (c))
1045
0
#define TOLOWER(c)              (ISUPPER (c) ? (c) - 'A' + 'a' : (c))
1046
1047
#ifndef USE_XLOCALE
1048
1049
static guint64
1050
g_parse_long_long (const gchar  *nptr,
1051
                   const gchar **endptr,
1052
                   guint         base,
1053
                   gboolean     *negative)
1054
{
1055
  /* this code is based on on the strtol(3) code from GNU libc released under
1056
   * the GNU Lesser General Public License.
1057
   *
1058
   * Copyright (C) 1991,92,94,95,96,97,98,99,2000,01,02
1059
   *        Free Software Foundation, Inc.
1060
   */
1061
  gboolean overflow;
1062
  guint64 cutoff;
1063
  guint64 cutlim;
1064
  guint64 ui64;
1065
  const gchar *s, *save;
1066
  guchar c;
1067
1068
  g_return_val_if_fail (nptr != NULL, 0);
1069
1070
  *negative = FALSE;
1071
  if (base == 1 || base > 36)
1072
    {
1073
      errno = EINVAL;
1074
      if (endptr)
1075
        *endptr = nptr;
1076
      return 0;
1077
    }
1078
1079
  save = s = nptr;
1080
1081
  /* Skip white space.  */
1082
  while (ISSPACE (*s))
1083
    ++s;
1084
1085
  if (G_UNLIKELY (!*s))
1086
    goto noconv;
1087
1088
  /* Check for a sign.  */
1089
  if (*s == '-')
1090
    {
1091
      *negative = TRUE;
1092
      ++s;
1093
    }
1094
  else if (*s == '+')
1095
    ++s;
1096
1097
  /* Recognize number prefix and if BASE is zero, figure it out ourselves.  */
1098
  if (*s == '0')
1099
    {
1100
      if ((base == 0 || base == 16) && TOUPPER (s[1]) == 'X')
1101
        {
1102
          s += 2;
1103
          base = 16;
1104
        }
1105
      else if (base == 0)
1106
        base = 8;
1107
    }
1108
  else if (base == 0)
1109
    base = 10;
1110
1111
  /* Save the pointer so we can check later if anything happened.  */
1112
  save = s;
1113
  cutoff = G_MAXUINT64 / base;
1114
  cutlim = G_MAXUINT64 % base;
1115
1116
  overflow = FALSE;
1117
  ui64 = 0;
1118
  c = *s;
1119
  for (; c; c = *++s)
1120
    {
1121
      if (c >= '0' && c <= '9')
1122
        c -= '0';
1123
      else if (ISALPHA (c))
1124
        c = TOUPPER (c) - 'A' + 10;
1125
      else
1126
        break;
1127
      if (c >= base)
1128
        break;
1129
      /* Check for overflow.  */
1130
      if (ui64 > cutoff || (ui64 == cutoff && c > cutlim))
1131
        overflow = TRUE;
1132
      else
1133
        {
1134
          ui64 *= base;
1135
          ui64 += c;
1136
        }
1137
    }
1138
1139
  /* Check if anything actually happened.  */
1140
  if (s == save)
1141
    goto noconv;
1142
1143
  /* Store in ENDPTR the address of one character
1144
     past the last character we converted.  */
1145
  if (endptr)
1146
    *endptr = s;
1147
1148
  if (G_UNLIKELY (overflow))
1149
    {
1150
      errno = ERANGE;
1151
      return G_MAXUINT64;
1152
    }
1153
1154
  return ui64;
1155
1156
 noconv:
1157
  /* We must handle a special case here: the base is 0 or 16 and the
1158
     first two characters are '0' and 'x', but the rest are no
1159
     hexadecimal digits.  This is no error case.  We return 0 and
1160
     ENDPTR points to the `x`.  */
1161
  if (endptr)
1162
    {
1163
      if (save - nptr >= 2 && TOUPPER (save[-1]) == 'X'
1164
          && save[-2] == '0')
1165
        *endptr = &save[-1];
1166
      else
1167
        /*  There was no number to convert.  */
1168
        *endptr = nptr;
1169
    }
1170
  return 0;
1171
}
1172
#endif /* !USE_XLOCALE */
1173
1174
/**
1175
 * g_ascii_strtoull:
1176
 * @nptr:    the string to convert to a numeric value.
1177
 * @endptr:  (out) (transfer none) (optional): if non-%NULL, it returns the
1178
 *           character after the last character used in the conversion.
1179
 * @base:    to be used for the conversion, 2..36 or 0
1180
 *
1181
 * Converts a string to a #guint64 value.
1182
 * This function behaves like the standard strtoull() function
1183
 * does in the C locale. It does this without actually
1184
 * changing the current locale, since that would not be
1185
 * thread-safe.
1186
 *
1187
 * Note that input with a leading minus sign (`-`) is accepted, and will return
1188
 * the negation of the parsed number, unless that would overflow a #guint64.
1189
 * Critically, this means you cannot assume that a short fixed length input will
1190
 * never result in a low return value, as the input could have a leading `-`.
1191
 *
1192
 * This function is typically used when reading configuration
1193
 * files or other non-user input that should be locale independent.
1194
 * To handle input from the user you should normally use the
1195
 * locale-sensitive system strtoull() function.
1196
 *
1197
 * If the correct value would cause overflow, %G_MAXUINT64
1198
 * is returned, and `ERANGE` is stored in `errno`.
1199
 * If the base is outside the valid range, zero is returned, and
1200
 * `EINVAL` is stored in `errno`.
1201
 * If the string conversion fails, zero is returned, and @endptr returns
1202
 * @nptr (if @endptr is non-%NULL).
1203
 *
1204
 * Returns: the #guint64 value or zero on error.
1205
 *
1206
 * Since: 2.2
1207
 */
1208
guint64
1209
g_ascii_strtoull (const gchar *nptr,
1210
                  gchar      **endptr,
1211
                  guint        base)
1212
12.4M
{
1213
12.4M
#ifdef USE_XLOCALE
1214
12.4M
  return strtoull_l (nptr, endptr, base, get_C_locale ());
1215
#else
1216
  gboolean negative;
1217
  guint64 result;
1218
1219
  result = g_parse_long_long (nptr, (const gchar **) endptr, base, &negative);
1220
1221
  /* Return the result of the appropriate sign.  */
1222
  return negative ? -result : result;
1223
#endif
1224
12.4M
}
1225
1226
/**
1227
 * g_ascii_strtoll:
1228
 * @nptr:    the string to convert to a numeric value.
1229
 * @endptr:  (out) (transfer none) (optional): if non-%NULL, it returns the
1230
 *           character after the last character used in the conversion.
1231
 * @base:    to be used for the conversion, 2..36 or 0
1232
 *
1233
 * Converts a string to a #gint64 value.
1234
 * This function behaves like the standard strtoll() function
1235
 * does in the C locale. It does this without actually
1236
 * changing the current locale, since that would not be
1237
 * thread-safe.
1238
 *
1239
 * This function is typically used when reading configuration
1240
 * files or other non-user input that should be locale independent.
1241
 * To handle input from the user you should normally use the
1242
 * locale-sensitive system strtoll() function.
1243
 *
1244
 * If the correct value would cause overflow, %G_MAXINT64 or %G_MININT64
1245
 * is returned, and `ERANGE` is stored in `errno`.
1246
 * If the base is outside the valid range, zero is returned, and
1247
 * `EINVAL` is stored in `errno`. If the
1248
 * string conversion fails, zero is returned, and @endptr returns @nptr
1249
 * (if @endptr is non-%NULL).
1250
 *
1251
 * Returns: the #gint64 value or zero on error.
1252
 *
1253
 * Since: 2.12
1254
 */
1255
gint64
1256
g_ascii_strtoll (const gchar *nptr,
1257
                 gchar      **endptr,
1258
                 guint        base)
1259
0
{
1260
0
#ifdef USE_XLOCALE
1261
0
  return strtoll_l (nptr, endptr, base, get_C_locale ());
1262
#else
1263
  gboolean negative;
1264
  guint64 result;
1265
1266
  result = g_parse_long_long (nptr, (const gchar **) endptr, base, &negative);
1267
1268
  if (negative && result > (guint64) G_MININT64)
1269
    {
1270
      errno = ERANGE;
1271
      return G_MININT64;
1272
    }
1273
  else if (!negative && result > (guint64) G_MAXINT64)
1274
    {
1275
      errno = ERANGE;
1276
      return G_MAXINT64;
1277
    }
1278
  else if (negative)
1279
    return - (gint64) result;
1280
  else
1281
    return (gint64) result;
1282
#endif
1283
0
}
1284
1285
/**
1286
 * g_strerror:
1287
 * @errnum: the system error number. See the standard C %errno
1288
 *     documentation
1289
 *
1290
 * Returns a string corresponding to the given error code, e.g. "no
1291
 * such process". Unlike strerror(), this always returns a string in
1292
 * UTF-8 encoding, and the pointer is guaranteed to remain valid for
1293
 * the lifetime of the process.
1294
 *
1295
 * Note that the string may be translated according to the current locale.
1296
 *
1297
 * The value of %errno will not be changed by this function. However, it may
1298
 * be changed by intermediate function calls, so you should save its value
1299
 * as soon as the call returns:
1300
 * |[
1301
 *   int saved_errno;
1302
 *
1303
 *   ret = read (blah);
1304
 *   saved_errno = errno;
1305
 *
1306
 *   g_strerror (saved_errno);
1307
 * ]|
1308
 *
1309
 * Returns: a UTF-8 string describing the error code. If the error code
1310
 *     is unknown, it returns a string like "unknown error (<code>)".
1311
 */
1312
const gchar *
1313
g_strerror (gint errnum)
1314
0
{
1315
0
  static GHashTable *errors;
1316
0
  G_LOCK_DEFINE_STATIC (errors);
1317
0
  const gchar *msg;
1318
0
  gint saved_errno = errno;
1319
1320
0
  G_LOCK (errors);
1321
0
  if (errors)
1322
0
    msg = g_hash_table_lookup (errors, GINT_TO_POINTER (errnum));
1323
0
  else
1324
0
    {
1325
0
      errors = g_hash_table_new (NULL, NULL);
1326
0
      msg = NULL;
1327
0
    }
1328
1329
0
  if (!msg)
1330
0
    {
1331
0
      gchar buf[1024];
1332
0
      GError *error = NULL;
1333
1334
#if defined(G_OS_WIN32)
1335
      strerror_s (buf, sizeof (buf), errnum);
1336
      msg = buf;
1337
#elif defined(HAVE_STRERROR_R)
1338
      /* Match the condition in strerror_r(3) for glibc */
1339
0
#  if defined(STRERROR_R_CHAR_P)
1340
0
      msg = strerror_r (errnum, buf, sizeof (buf));
1341
#  else
1342
      (void) strerror_r (errnum, buf, sizeof (buf));
1343
      msg = buf;
1344
#  endif /* HAVE_STRERROR_R */
1345
#else
1346
      g_strlcpy (buf, strerror (errnum), sizeof (buf));
1347
      msg = buf;
1348
#endif
1349
0
      if (!g_get_console_charset (NULL))
1350
0
        {
1351
0
          msg = g_locale_to_utf8 (msg, -1, NULL, NULL, &error);
1352
0
          if (error)
1353
0
            g_print ("%s\n", error->message);
1354
0
        }
1355
0
      else if (msg == (const gchar *)buf)
1356
0
        msg = g_strdup (buf);
1357
1358
0
      g_hash_table_insert (errors, GINT_TO_POINTER (errnum), (char *) msg);
1359
0
    }
1360
0
  G_UNLOCK (errors);
1361
1362
0
  errno = saved_errno;
1363
0
  return msg;
1364
0
}
1365
1366
/**
1367
 * g_strsignal:
1368
 * @signum: the signal number. See the `signal` documentation
1369
 *
1370
 * Returns a string describing the given signal, e.g. "Segmentation fault".
1371
 * You should use this function in preference to strsignal(), because it
1372
 * returns a string in UTF-8 encoding, and since not all platforms support
1373
 * the strsignal() function.
1374
 *
1375
 * Returns: a UTF-8 string describing the signal. If the signal is unknown,
1376
 *     it returns "unknown signal (<signum>)".
1377
 */
1378
const gchar *
1379
g_strsignal (gint signum)
1380
0
{
1381
0
  gchar *msg;
1382
0
  gchar *tofree;
1383
0
  const gchar *ret;
1384
1385
0
  msg = tofree = NULL;
1386
1387
0
#ifdef HAVE_STRSIGNAL
1388
0
  msg = strsignal (signum);
1389
0
  if (!g_get_console_charset (NULL))
1390
0
    msg = tofree = g_locale_to_utf8 (msg, -1, NULL, NULL, NULL);
1391
0
#endif
1392
1393
0
  if (!msg)
1394
0
    msg = tofree = g_strdup_printf ("unknown signal (%d)", signum);
1395
0
  ret = g_intern_string (msg);
1396
0
  g_free (tofree);
1397
1398
0
  return ret;
1399
0
}
1400
1401
/* Functions g_strlcpy and g_strlcat were originally developed by
1402
 * Todd C. Miller <Todd.Miller@courtesan.com> to simplify writing secure code.
1403
 * See http://www.openbsd.org/cgi-bin/man.cgi?query=strlcpy 
1404
 * for more information.
1405
 */
1406
1407
#ifdef HAVE_STRLCPY
1408
/* Use the native ones, if available; they might be implemented in assembly */
1409
gsize
1410
g_strlcpy (gchar       *dest,
1411
           const gchar *src,
1412
           gsize        dest_size)
1413
{
1414
  g_return_val_if_fail (dest != NULL, 0);
1415
  g_return_val_if_fail (src  != NULL, 0);
1416
1417
  return strlcpy (dest, src, dest_size);
1418
}
1419
1420
gsize
1421
g_strlcat (gchar       *dest,
1422
           const gchar *src,
1423
           gsize        dest_size)
1424
{
1425
  g_return_val_if_fail (dest != NULL, 0);
1426
  g_return_val_if_fail (src  != NULL, 0);
1427
1428
  return strlcat (dest, src, dest_size);
1429
}
1430
1431
#else /* ! HAVE_STRLCPY */
1432
/**
1433
 * g_strlcpy:
1434
 * @dest: destination buffer
1435
 * @src: source buffer
1436
 * @dest_size: length of @dest in bytes
1437
 *
1438
 * Portability wrapper that calls strlcpy() on systems which have it,
1439
 * and emulates strlcpy() otherwise. Copies @src to @dest; @dest is
1440
 * guaranteed to be nul-terminated; @src must be nul-terminated;
1441
 * @dest_size is the buffer size, not the number of bytes to copy.
1442
 *
1443
 * At most @dest_size - 1 characters will be copied. Always nul-terminates
1444
 * (unless @dest_size is 0). This function does not allocate memory. Unlike
1445
 * strncpy(), this function doesn't pad @dest (so it's often faster). It
1446
 * returns the size of the attempted result, strlen (src), so if
1447
 * @retval >= @dest_size, truncation occurred.
1448
 *
1449
 * Caveat: strlcpy() is supposedly more secure than strcpy() or strncpy(),
1450
 * but if you really want to avoid screwups, g_strdup() is an even better
1451
 * idea.
1452
 *
1453
 * Returns: length of @src
1454
 */
1455
gsize
1456
g_strlcpy (gchar       *dest,
1457
           const gchar *src,
1458
           gsize        dest_size)
1459
0
{
1460
0
  gchar *d = dest;
1461
0
  const gchar *s = src;
1462
0
  gsize n = dest_size;
1463
1464
0
  g_return_val_if_fail (dest != NULL, 0);
1465
0
  g_return_val_if_fail (src  != NULL, 0);
1466
1467
  /* Copy as many bytes as will fit */
1468
0
  if (n != 0 && --n != 0)
1469
0
    do
1470
0
      {
1471
0
        gchar c = *s++;
1472
1473
0
        *d++ = c;
1474
0
        if (c == 0)
1475
0
          break;
1476
0
      }
1477
0
    while (--n != 0);
1478
1479
  /* If not enough room in dest, add NUL and traverse rest of src */
1480
0
  if (n == 0)
1481
0
    {
1482
0
      if (dest_size != 0)
1483
0
        *d = 0;
1484
0
      while (*s++)
1485
0
        ;
1486
0
    }
1487
1488
0
  return s - src - 1;  /* count does not include NUL */
1489
0
}
1490
1491
/**
1492
 * g_strlcat:
1493
 * @dest: destination buffer, already containing one nul-terminated string
1494
 * @src: source buffer
1495
 * @dest_size: length of @dest buffer in bytes (not length of existing string
1496
 *     inside @dest)
1497
 *
1498
 * Portability wrapper that calls strlcat() on systems which have it,
1499
 * and emulates it otherwise. Appends nul-terminated @src string to @dest,
1500
 * guaranteeing nul-termination for @dest. The total size of @dest won't
1501
 * exceed @dest_size.
1502
 *
1503
 * At most @dest_size - 1 characters will be copied. Unlike strncat(),
1504
 * @dest_size is the full size of dest, not the space left over. This
1505
 * function does not allocate memory. It always nul-terminates (unless
1506
 * @dest_size == 0 or there were no nul characters in the @dest_size
1507
 * characters of dest to start with).
1508
 *
1509
 * Caveat: this is supposedly a more secure alternative to strcat() or
1510
 * strncat(), but for real security g_strconcat() is harder to mess up.
1511
 *
1512
 * Returns: size of attempted result, which is MIN (dest_size, strlen
1513
 *     (original dest)) + strlen (src), so if retval >= dest_size,
1514
 *     truncation occurred.
1515
 */
1516
gsize
1517
g_strlcat (gchar       *dest,
1518
           const gchar *src,
1519
           gsize        dest_size)
1520
0
{
1521
0
  gchar *d = dest;
1522
0
  const gchar *s = src;
1523
0
  gsize bytes_left = dest_size;
1524
0
  gsize dlength;  /* Logically, MIN (strlen (d), dest_size) */
1525
1526
0
  g_return_val_if_fail (dest != NULL, 0);
1527
0
  g_return_val_if_fail (src  != NULL, 0);
1528
1529
  /* Find the end of dst and adjust bytes left but don't go past end */
1530
0
  while (*d != 0 && bytes_left-- != 0)
1531
0
    d++;
1532
0
  dlength = d - dest;
1533
0
  bytes_left = dest_size - dlength;
1534
1535
0
  if (bytes_left == 0)
1536
0
    return dlength + strlen (s);
1537
1538
0
  while (*s != 0)
1539
0
    {
1540
0
      if (bytes_left != 1)
1541
0
        {
1542
0
          *d++ = *s;
1543
0
          bytes_left--;
1544
0
        }
1545
0
      s++;
1546
0
    }
1547
0
  *d = 0;
1548
1549
0
  return dlength + (s - src);  /* count does not include NUL */
1550
0
}
1551
#endif /* ! HAVE_STRLCPY */
1552
1553
/**
1554
 * g_ascii_strdown:
1555
 * @str: a string
1556
 * @len: length of @str in bytes, or -1 if @str is nul-terminated
1557
 *
1558
 * Converts all upper case ASCII letters to lower case ASCII letters.
1559
 *
1560
 * Returns: a newly-allocated string, with all the upper case
1561
 *     characters in @str converted to lower case, with semantics that
1562
 *     exactly match g_ascii_tolower(). (Note that this is unlike the
1563
 *     old g_strdown(), which modified the string in place.)
1564
 */
1565
gchar*
1566
g_ascii_strdown (const gchar *str,
1567
                 gssize       len)
1568
0
{
1569
0
  gchar *result, *s;
1570
1571
0
  g_return_val_if_fail (str != NULL, NULL);
1572
1573
0
  if (len < 0)
1574
0
    len = (gssize) strlen (str);
1575
1576
0
  result = g_strndup (str, (gsize) len);
1577
0
  for (s = result; *s; s++)
1578
0
    *s = g_ascii_tolower (*s);
1579
1580
0
  return result;
1581
0
}
1582
1583
/**
1584
 * g_ascii_strup:
1585
 * @str: a string
1586
 * @len: length of @str in bytes, or -1 if @str is nul-terminated
1587
 *
1588
 * Converts all lower case ASCII letters to upper case ASCII letters.
1589
 *
1590
 * Returns: a newly allocated string, with all the lower case
1591
 *     characters in @str converted to upper case, with semantics that
1592
 *     exactly match g_ascii_toupper(). (Note that this is unlike the
1593
 *     old g_strup(), which modified the string in place.)
1594
 */
1595
gchar*
1596
g_ascii_strup (const gchar *str,
1597
               gssize       len)
1598
0
{
1599
0
  gchar *result, *s;
1600
1601
0
  g_return_val_if_fail (str != NULL, NULL);
1602
1603
0
  if (len < 0)
1604
0
    len = (gssize) strlen (str);
1605
1606
0
  result = g_strndup (str, (gsize) len);
1607
0
  for (s = result; *s; s++)
1608
0
    *s = g_ascii_toupper (*s);
1609
1610
0
  return result;
1611
0
}
1612
1613
/**
1614
 * g_str_is_ascii:
1615
 * @str: a string
1616
 *
1617
 * Determines if a string is pure ASCII. A string is pure ASCII if it
1618
 * contains no bytes with the high bit set.
1619
 *
1620
 * Returns: %TRUE if @str is ASCII
1621
 *
1622
 * Since: 2.40
1623
 */
1624
gboolean
1625
g_str_is_ascii (const gchar *str)
1626
414
{
1627
414
  gsize i;
1628
1629
1.46k
  for (i = 0; str[i]; i++)
1630
1.40k
    if (str[i] & 0x80)
1631
349
      return FALSE;
1632
1633
65
  return TRUE;
1634
414
}
1635
1636
/**
1637
 * g_strdown:
1638
 * @string: the string to convert.
1639
 *
1640
 * Converts a string to lower case.
1641
 *
1642
 * Returns: the string
1643
 *
1644
 * Deprecated:2.2: This function is totally broken for the reasons discussed
1645
 * in the g_strncasecmp() docs - use g_ascii_strdown() or g_utf8_strdown()
1646
 * instead.
1647
 **/
1648
gchar*
1649
g_strdown (gchar *string)
1650
0
{
1651
0
  guchar *s;
1652
1653
0
  g_return_val_if_fail (string != NULL, NULL);
1654
1655
0
  s = (guchar *) string;
1656
1657
0
  while (*s)
1658
0
    {
1659
0
      if (isupper (*s))
1660
0
        *s = tolower (*s);
1661
0
      s++;
1662
0
    }
1663
1664
0
  return (gchar *) string;
1665
0
}
1666
1667
/**
1668
 * g_strup:
1669
 * @string: the string to convert
1670
 *
1671
 * Converts a string to upper case.
1672
 *
1673
 * Returns: the string
1674
 *
1675
 * Deprecated:2.2: This function is totally broken for the reasons
1676
 *     discussed in the g_strncasecmp() docs - use g_ascii_strup()
1677
 *     or g_utf8_strup() instead.
1678
 */
1679
gchar*
1680
g_strup (gchar *string)
1681
0
{
1682
0
  guchar *s;
1683
1684
0
  g_return_val_if_fail (string != NULL, NULL);
1685
1686
0
  s = (guchar *) string;
1687
1688
0
  while (*s)
1689
0
    {
1690
0
      if (islower (*s))
1691
0
        *s = toupper (*s);
1692
0
      s++;
1693
0
    }
1694
1695
0
  return (gchar *) string;
1696
0
}
1697
1698
/**
1699
 * g_strreverse:
1700
 * @string: the string to reverse
1701
 *
1702
 * Reverses all of the bytes in a string. For example,
1703
 * `g_strreverse ("abcdef")` will result in "fedcba".
1704
 *
1705
 * Note that g_strreverse() doesn't work on UTF-8 strings
1706
 * containing multibyte characters. For that purpose, use
1707
 * g_utf8_strreverse().
1708
 *
1709
 * Returns: the same pointer passed in as @string
1710
 */
1711
gchar*
1712
g_strreverse (gchar *string)
1713
0
{
1714
0
  g_return_val_if_fail (string != NULL, NULL);
1715
1716
0
  if (*string)
1717
0
    {
1718
0
      gchar *h, *t;
1719
1720
0
      h = string;
1721
0
      t = string + strlen (string) - 1;
1722
1723
0
      while (h < t)
1724
0
        {
1725
0
          gchar c;
1726
1727
0
          c = *h;
1728
0
          *h = *t;
1729
0
          h++;
1730
0
          *t = c;
1731
0
          t--;
1732
0
        }
1733
0
    }
1734
1735
0
  return string;
1736
0
}
1737
1738
/**
1739
 * g_ascii_tolower:
1740
 * @c: any character
1741
 *
1742
 * Convert a character to ASCII lower case.
1743
 *
1744
 * Unlike the standard C library tolower() function, this only
1745
 * recognizes standard ASCII letters and ignores the locale, returning
1746
 * all non-ASCII characters unchanged, even if they are lower case
1747
 * letters in a particular character set. Also unlike the standard
1748
 * library function, this takes and returns a char, not an int, so
1749
 * don't call it on %EOF but no need to worry about casting to #guchar
1750
 * before passing a possibly non-ASCII character in.
1751
 *
1752
 * Returns: the result of converting @c to lower case. If @c is
1753
 *     not an ASCII upper case letter, @c is returned unchanged.
1754
 */
1755
gchar
1756
g_ascii_tolower (gchar c)
1757
42.0k
{
1758
42.0k
  return g_ascii_isupper (c) ? c - 'A' + 'a' : c;
1759
42.0k
}
1760
1761
/**
1762
 * g_ascii_toupper:
1763
 * @c: any character
1764
 *
1765
 * Convert a character to ASCII upper case.
1766
 *
1767
 * Unlike the standard C library toupper() function, this only
1768
 * recognizes standard ASCII letters and ignores the locale, returning
1769
 * all non-ASCII characters unchanged, even if they are upper case
1770
 * letters in a particular character set. Also unlike the standard
1771
 * library function, this takes and returns a char, not an int, so
1772
 * don't call it on %EOF but no need to worry about casting to #guchar
1773
 * before passing a possibly non-ASCII character in.
1774
 *
1775
 * Returns: the result of converting @c to upper case. If @c is not
1776
 *    an ASCII lower case letter, @c is returned unchanged.
1777
 */
1778
gchar
1779
g_ascii_toupper (gchar c)
1780
0
{
1781
0
  return g_ascii_islower (c) ? c - 'a' + 'A' : c;
1782
0
}
1783
1784
/**
1785
 * g_ascii_digit_value:
1786
 * @c: an ASCII character
1787
 *
1788
 * Determines the numeric value of a character as a decimal digit.
1789
 * Differs from g_unichar_digit_value() because it takes a char, so
1790
 * there's no worry about sign extension if characters are signed.
1791
 *
1792
 * Returns: If @c is a decimal digit (according to g_ascii_isdigit()),
1793
 *    its numeric value. Otherwise, -1.
1794
 */
1795
int
1796
g_ascii_digit_value (gchar c)
1797
0
{
1798
0
  if (g_ascii_isdigit (c))
1799
0
    return c - '0';
1800
0
  return -1;
1801
0
}
1802
1803
/**
1804
 * g_ascii_xdigit_value:
1805
 * @c: an ASCII character.
1806
 *
1807
 * Determines the numeric value of a character as a hexadecimal
1808
 * digit. Differs from g_unichar_xdigit_value() because it takes
1809
 * a char, so there's no worry about sign extension if characters
1810
 * are signed.
1811
 *
1812
 * Returns: If @c is a hex digit (according to g_ascii_isxdigit()),
1813
 *     its numeric value. Otherwise, -1.
1814
 */
1815
int
1816
g_ascii_xdigit_value (gchar c)
1817
0
{
1818
0
  if (c >= 'A' && c <= 'F')
1819
0
    return c - 'A' + 10;
1820
0
  if (c >= 'a' && c <= 'f')
1821
0
    return c - 'a' + 10;
1822
0
  return g_ascii_digit_value (c);
1823
0
}
1824
1825
/**
1826
 * g_ascii_strcasecmp:
1827
 * @s1: string to compare with @s2
1828
 * @s2: string to compare with @s1
1829
 *
1830
 * Compare two strings, ignoring the case of ASCII characters.
1831
 *
1832
 * Unlike the BSD strcasecmp() function, this only recognizes standard
1833
 * ASCII letters and ignores the locale, treating all non-ASCII
1834
 * bytes as if they are not letters.
1835
 *
1836
 * This function should be used only on strings that are known to be
1837
 * in encodings where the bytes corresponding to ASCII letters always
1838
 * represent themselves. This includes UTF-8 and the ISO-8859-*
1839
 * charsets, but not for instance double-byte encodings like the
1840
 * Windows Codepage 932, where the trailing bytes of double-byte
1841
 * characters include all ASCII letters. If you compare two CP932
1842
 * strings using this function, you will get false matches.
1843
 *
1844
 * Both @s1 and @s2 must be non-%NULL.
1845
 *
1846
 * Returns: 0 if the strings match, a negative value if @s1 < @s2,
1847
 *     or a positive value if @s1 > @s2.
1848
 */
1849
gint
1850
g_ascii_strcasecmp (const gchar *s1,
1851
                    const gchar *s2)
1852
0
{
1853
0
  gint c1, c2;
1854
1855
0
  g_return_val_if_fail (s1 != NULL, 0);
1856
0
  g_return_val_if_fail (s2 != NULL, 0);
1857
1858
0
  while (*s1 && *s2)
1859
0
    {
1860
0
      c1 = (gint)(guchar) TOLOWER (*s1);
1861
0
      c2 = (gint)(guchar) TOLOWER (*s2);
1862
0
      if (c1 != c2)
1863
0
        return (c1 - c2);
1864
0
      s1++; s2++;
1865
0
    }
1866
1867
0
  return (((gint)(guchar) *s1) - ((gint)(guchar) *s2));
1868
0
}
1869
1870
/**
1871
 * g_ascii_strncasecmp:
1872
 * @s1: string to compare with @s2
1873
 * @s2: string to compare with @s1
1874
 * @n: number of characters to compare
1875
 *
1876
 * Compare @s1 and @s2, ignoring the case of ASCII characters and any
1877
 * characters after the first @n in each string.
1878
 *
1879
 * Unlike the BSD strcasecmp() function, this only recognizes standard
1880
 * ASCII letters and ignores the locale, treating all non-ASCII
1881
 * characters as if they are not letters.
1882
 *
1883
 * The same warning as in g_ascii_strcasecmp() applies: Use this
1884
 * function only on strings known to be in encodings where bytes
1885
 * corresponding to ASCII letters always represent themselves.
1886
 *
1887
 * Returns: 0 if the strings match, a negative value if @s1 < @s2,
1888
 *     or a positive value if @s1 > @s2.
1889
 */
1890
gint
1891
g_ascii_strncasecmp (const gchar *s1,
1892
                     const gchar *s2,
1893
                     gsize        n)
1894
0
{
1895
0
  gint c1, c2;
1896
1897
0
  g_return_val_if_fail (s1 != NULL, 0);
1898
0
  g_return_val_if_fail (s2 != NULL, 0);
1899
1900
0
  while (n && *s1 && *s2)
1901
0
    {
1902
0
      n -= 1;
1903
0
      c1 = (gint)(guchar) TOLOWER (*s1);
1904
0
      c2 = (gint)(guchar) TOLOWER (*s2);
1905
0
      if (c1 != c2)
1906
0
        return (c1 - c2);
1907
0
      s1++; s2++;
1908
0
    }
1909
1910
0
  if (n)
1911
0
    return (((gint) (guchar) *s1) - ((gint) (guchar) *s2));
1912
0
  else
1913
0
    return 0;
1914
0
}
1915
1916
/**
1917
 * g_strcasecmp:
1918
 * @s1: a string
1919
 * @s2: a string to compare with @s1
1920
 *
1921
 * A case-insensitive string comparison, corresponding to the standard
1922
 * strcasecmp() function on platforms which support it.
1923
 *
1924
 * Returns: 0 if the strings match, a negative value if @s1 < @s2,
1925
 *     or a positive value if @s1 > @s2.
1926
 *
1927
 * Deprecated:2.2: See g_strncasecmp() for a discussion of why this
1928
 *     function is deprecated and how to replace it.
1929
 */
1930
gint
1931
g_strcasecmp (const gchar *s1,
1932
              const gchar *s2)
1933
0
{
1934
0
#ifdef HAVE_STRCASECMP
1935
0
  g_return_val_if_fail (s1 != NULL, 0);
1936
0
  g_return_val_if_fail (s2 != NULL, 0);
1937
1938
0
  return strcasecmp (s1, s2);
1939
#else
1940
  gint c1, c2;
1941
1942
  g_return_val_if_fail (s1 != NULL, 0);
1943
  g_return_val_if_fail (s2 != NULL, 0);
1944
1945
  while (*s1 && *s2)
1946
    {
1947
      /* According to A. Cox, some platforms have islower's that
1948
       * don't work right on non-uppercase
1949
       */
1950
      c1 = isupper ((guchar)*s1) ? tolower ((guchar)*s1) : *s1;
1951
      c2 = isupper ((guchar)*s2) ? tolower ((guchar)*s2) : *s2;
1952
      if (c1 != c2)
1953
        return (c1 - c2);
1954
      s1++; s2++;
1955
    }
1956
1957
  return (((gint)(guchar) *s1) - ((gint)(guchar) *s2));
1958
#endif
1959
0
}
1960
1961
/**
1962
 * g_strncasecmp:
1963
 * @s1: a string
1964
 * @s2: a string to compare with @s1
1965
 * @n: the maximum number of characters to compare
1966
 *
1967
 * A case-insensitive string comparison, corresponding to the standard
1968
 * strncasecmp() function on platforms which support it. It is similar
1969
 * to g_strcasecmp() except it only compares the first @n characters of
1970
 * the strings.
1971
 *
1972
 * Returns: 0 if the strings match, a negative value if @s1 < @s2,
1973
 *     or a positive value if @s1 > @s2.
1974
 *
1975
 * Deprecated:2.2: The problem with g_strncasecmp() is that it does
1976
 *     the comparison by calling toupper()/tolower(). These functions
1977
 *     are locale-specific and operate on single bytes. However, it is
1978
 *     impossible to handle things correctly from an internationalization
1979
 *     standpoint by operating on bytes, since characters may be multibyte.
1980
 *     Thus g_strncasecmp() is broken if your string is guaranteed to be
1981
 *     ASCII, since it is locale-sensitive, and it's broken if your string
1982
 *     is localized, since it doesn't work on many encodings at all,
1983
 *     including UTF-8, EUC-JP, etc.
1984
 *
1985
 *     There are therefore two replacement techniques: g_ascii_strncasecmp(),
1986
 *     which only works on ASCII and is not locale-sensitive, and
1987
 *     g_utf8_casefold() followed by strcmp() on the resulting strings,
1988
 *     which is good for case-insensitive sorting of UTF-8.
1989
 */
1990
gint
1991
g_strncasecmp (const gchar *s1,
1992
               const gchar *s2,
1993
               guint n)
1994
0
{
1995
0
#ifdef HAVE_STRNCASECMP
1996
0
  return strncasecmp (s1, s2, n);
1997
#else
1998
  gint c1, c2;
1999
2000
  g_return_val_if_fail (s1 != NULL, 0);
2001
  g_return_val_if_fail (s2 != NULL, 0);
2002
2003
  while (n && *s1 && *s2)
2004
    {
2005
      n -= 1;
2006
      /* According to A. Cox, some platforms have islower's that
2007
       * don't work right on non-uppercase
2008
       */
2009
      c1 = isupper ((guchar)*s1) ? tolower ((guchar)*s1) : *s1;
2010
      c2 = isupper ((guchar)*s2) ? tolower ((guchar)*s2) : *s2;
2011
      if (c1 != c2)
2012
        return (c1 - c2);
2013
      s1++; s2++;
2014
    }
2015
2016
  if (n)
2017
    return (((gint) (guchar) *s1) - ((gint) (guchar) *s2));
2018
  else
2019
    return 0;
2020
#endif
2021
0
}
2022
2023
/**
2024
 * g_strdelimit:
2025
 * @string: the string to convert
2026
 * @delimiters: (nullable): a string containing the current delimiters,
2027
 *     or %NULL to use the standard delimiters defined in #G_STR_DELIMITERS
2028
 * @new_delimiter: the new delimiter character
2029
 *
2030
 * Converts any delimiter characters in @string to @new_delimiter.
2031
 * Any characters in @string which are found in @delimiters are
2032
 * changed to the @new_delimiter character. Modifies @string in place,
2033
 * and returns @string itself, not a copy. The return value is to
2034
 * allow nesting such as
2035
 * |[<!-- language="C" -->
2036
 *   g_ascii_strup (g_strdelimit (str, "abc", '?'))
2037
 * ]|
2038
 *
2039
 * In order to modify a copy, you may use `g_strdup()`:
2040
 * |[<!-- language="C" -->
2041
 *   reformatted = g_strdelimit (g_strdup (const_str), "abc", '?');
2042
 *   ...
2043
 *   g_free (reformatted);
2044
 * ]|
2045
 *
2046
 * Returns: @string
2047
 */
2048
gchar *
2049
g_strdelimit (gchar       *string,
2050
              const gchar *delimiters,
2051
              gchar        new_delim)
2052
15.2M
{
2053
15.2M
  gchar *c;
2054
2055
15.2M
  g_return_val_if_fail (string != NULL, NULL);
2056
2057
15.2M
  if (!delimiters)
2058
0
    delimiters = G_STR_DELIMITERS;
2059
2060
187M
  for (c = string; *c; c++)
2061
172M
    {
2062
172M
      if (strchr (delimiters, *c))
2063
642k
        *c = new_delim;
2064
172M
    }
2065
2066
15.2M
  return string;
2067
15.2M
}
2068
2069
/**
2070
 * g_strcanon:
2071
 * @string: a nul-terminated array of bytes
2072
 * @valid_chars: bytes permitted in @string
2073
 * @substitutor: replacement character for disallowed bytes
2074
 *
2075
 * For each character in @string, if the character is not in @valid_chars,
2076
 * replaces the character with @substitutor. Modifies @string in place,
2077
 * and return @string itself, not a copy. The return value is to allow
2078
 * nesting such as
2079
 * |[<!-- language="C" -->
2080
 *   g_ascii_strup (g_strcanon (str, "abc", '?'))
2081
 * ]|
2082
 *
2083
 * In order to modify a copy, you may use `g_strdup()`:
2084
 * |[<!-- language="C" -->
2085
 *   reformatted = g_strcanon (g_strdup (const_str), "abc", '?');
2086
 *   ...
2087
 *   g_free (reformatted);
2088
 * ]|
2089
 *
2090
 * Returns: @string
2091
 */
2092
gchar *
2093
g_strcanon (gchar       *string,
2094
            const gchar *valid_chars,
2095
            gchar        substitutor)
2096
0
{
2097
0
  gchar *c;
2098
2099
0
  g_return_val_if_fail (string != NULL, NULL);
2100
0
  g_return_val_if_fail (valid_chars != NULL, NULL);
2101
2102
0
  for (c = string; *c; c++)
2103
0
    {
2104
0
      if (!strchr (valid_chars, *c))
2105
0
        *c = substitutor;
2106
0
    }
2107
2108
0
  return string;
2109
0
}
2110
2111
/**
2112
 * g_strcompress:
2113
 * @source: a string to compress
2114
 *
2115
 * Replaces all escaped characters with their one byte equivalent.
2116
 *
2117
 * This function does the reverse conversion of g_strescape().
2118
 *
2119
 * Returns: a newly-allocated copy of @source with all escaped
2120
 *     character compressed
2121
 */
2122
gchar *
2123
g_strcompress (const gchar *source)
2124
0
{
2125
0
  const gchar *p = source, *octal;
2126
0
  gchar *dest;
2127
0
  gchar *q;
2128
2129
0
  g_return_val_if_fail (source != NULL, NULL);
2130
2131
0
  dest = g_malloc (strlen (source) + 1);
2132
0
  q = dest;
2133
2134
0
  while (*p)
2135
0
    {
2136
0
      if (*p == '\\')
2137
0
        {
2138
0
          p++;
2139
0
          switch (*p)
2140
0
            {
2141
0
            case '\0':
2142
0
              g_warning ("g_strcompress: trailing \\");
2143
0
              goto out;
2144
0
            case '0':  case '1':  case '2':  case '3':  case '4':
2145
0
            case '5':  case '6':  case '7':
2146
0
              *q = 0;
2147
0
              octal = p;
2148
0
              while ((p < octal + 3) && (*p >= '0') && (*p <= '7'))
2149
0
                {
2150
0
                  *q = (*q * 8) + (*p - '0');
2151
0
                  p++;
2152
0
                }
2153
0
              q++;
2154
0
              p--;
2155
0
              break;
2156
0
            case 'b':
2157
0
              *q++ = '\b';
2158
0
              break;
2159
0
            case 'f':
2160
0
              *q++ = '\f';
2161
0
              break;
2162
0
            case 'n':
2163
0
              *q++ = '\n';
2164
0
              break;
2165
0
            case 'r':
2166
0
              *q++ = '\r';
2167
0
              break;
2168
0
            case 't':
2169
0
              *q++ = '\t';
2170
0
              break;
2171
0
            case 'v':
2172
0
              *q++ = '\v';
2173
0
              break;
2174
0
            default:            /* Also handles \" and \\ */
2175
0
              *q++ = *p;
2176
0
              break;
2177
0
            }
2178
0
        }
2179
0
      else
2180
0
        *q++ = *p;
2181
0
      p++;
2182
0
    }
2183
0
out:
2184
0
  *q = 0;
2185
2186
0
  return dest;
2187
0
}
2188
2189
/**
2190
 * g_strescape:
2191
 * @source: a string to escape
2192
 * @exceptions: (nullable): a string of characters not to escape in @source
2193
 *
2194
 * Escapes the special characters '\b', '\f', '\n', '\r', '\t', '\v', '\'
2195
 * and '"' in the string @source by inserting a '\' before
2196
 * them. Additionally all characters in the range 0x01-0x1F (everything
2197
 * below SPACE) and in the range 0x7F-0xFF (all non-ASCII chars) are
2198
 * replaced with a '\' followed by their octal representation.
2199
 * Characters supplied in @exceptions are not escaped.
2200
 *
2201
 * g_strcompress() does the reverse conversion.
2202
 *
2203
 * Returns: a newly-allocated copy of @source with certain
2204
 *     characters escaped. See above.
2205
 */
2206
gchar *
2207
g_strescape (const gchar *source,
2208
             const gchar *exceptions)
2209
0
{
2210
0
  const guchar *p;
2211
0
  gchar *dest;
2212
0
  gchar *q;
2213
0
  guchar excmap[256];
2214
2215
0
  g_return_val_if_fail (source != NULL, NULL);
2216
2217
0
  p = (guchar *) source;
2218
  /* Each source byte needs maximally four destination chars (\777) */
2219
0
  q = dest = g_malloc (strlen (source) * 4 + 1);
2220
2221
0
  memset (excmap, 0, 256);
2222
0
  if (exceptions)
2223
0
    {
2224
0
      guchar *e = (guchar *) exceptions;
2225
2226
0
      while (*e)
2227
0
        {
2228
0
          excmap[*e] = 1;
2229
0
          e++;
2230
0
        }
2231
0
    }
2232
2233
0
  while (*p)
2234
0
    {
2235
0
      if (excmap[*p])
2236
0
        *q++ = *p;
2237
0
      else
2238
0
        {
2239
0
          switch (*p)
2240
0
            {
2241
0
            case '\b':
2242
0
              *q++ = '\\';
2243
0
              *q++ = 'b';
2244
0
              break;
2245
0
            case '\f':
2246
0
              *q++ = '\\';
2247
0
              *q++ = 'f';
2248
0
              break;
2249
0
            case '\n':
2250
0
              *q++ = '\\';
2251
0
              *q++ = 'n';
2252
0
              break;
2253
0
            case '\r':
2254
0
              *q++ = '\\';
2255
0
              *q++ = 'r';
2256
0
              break;
2257
0
            case '\t':
2258
0
              *q++ = '\\';
2259
0
              *q++ = 't';
2260
0
              break;
2261
0
            case '\v':
2262
0
              *q++ = '\\';
2263
0
              *q++ = 'v';
2264
0
              break;
2265
0
            case '\\':
2266
0
              *q++ = '\\';
2267
0
              *q++ = '\\';
2268
0
              break;
2269
0
            case '"':
2270
0
              *q++ = '\\';
2271
0
              *q++ = '"';
2272
0
              break;
2273
0
            default:
2274
0
              if ((*p < ' ') || (*p >= 0177))
2275
0
                {
2276
0
                  *q++ = '\\';
2277
0
                  *q++ = '0' + (((*p) >> 6) & 07);
2278
0
                  *q++ = '0' + (((*p) >> 3) & 07);
2279
0
                  *q++ = '0' + ((*p) & 07);
2280
0
                }
2281
0
              else
2282
0
                *q++ = *p;
2283
0
              break;
2284
0
            }
2285
0
        }
2286
0
      p++;
2287
0
    }
2288
0
  *q = 0;
2289
0
  return dest;
2290
0
}
2291
2292
/**
2293
 * g_strchug:
2294
 * @string: a string to remove the leading whitespace from
2295
 *
2296
 * Removes leading whitespace from a string, by moving the rest
2297
 * of the characters forward.
2298
 *
2299
 * This function doesn't allocate or reallocate any memory;
2300
 * it modifies @string in place. Therefore, it cannot be used on
2301
 * statically allocated strings.
2302
 *
2303
 * The pointer to @string is returned to allow the nesting of functions.
2304
 *
2305
 * Also see g_strchomp() and g_strstrip().
2306
 *
2307
 * Returns: @string
2308
 */
2309
gchar *
2310
g_strchug (gchar *string)
2311
0
{
2312
0
  guchar *start;
2313
2314
0
  g_return_val_if_fail (string != NULL, NULL);
2315
2316
0
  for (start = (guchar*) string; *start && g_ascii_isspace (*start); start++)
2317
0
    ;
2318
2319
0
  memmove (string, start, strlen ((gchar *) start) + 1);
2320
2321
0
  return string;
2322
0
}
2323
2324
/**
2325
 * g_strchomp:
2326
 * @string: a string to remove the trailing whitespace from
2327
 *
2328
 * Removes trailing whitespace from a string.
2329
 *
2330
 * This function doesn't allocate or reallocate any memory;
2331
 * it modifies @string in place. Therefore, it cannot be used
2332
 * on statically allocated strings.
2333
 *
2334
 * The pointer to @string is returned to allow the nesting of functions.
2335
 *
2336
 * Also see g_strchug() and g_strstrip().
2337
 *
2338
 * Returns: @string
2339
 */
2340
gchar *
2341
g_strchomp (gchar *string)
2342
0
{
2343
0
  gsize len;
2344
2345
0
  g_return_val_if_fail (string != NULL, NULL);
2346
2347
0
  len = strlen (string);
2348
0
  while (len--)
2349
0
    {
2350
0
      if (g_ascii_isspace ((guchar) string[len]))
2351
0
        string[len] = '\0';
2352
0
      else
2353
0
        break;
2354
0
    }
2355
2356
0
  return string;
2357
0
}
2358
2359
/**
2360
 * g_strsplit:
2361
 * @string: a string to split
2362
 * @delimiter: a string which specifies the places at which to split
2363
 *     the string. The delimiter is not included in any of the resulting
2364
 *     strings, unless @max_tokens is reached.
2365
 * @max_tokens: the maximum number of pieces to split @string into.
2366
 *     If this is less than 1, the string is split completely.
2367
 *
2368
 * Splits a string into a maximum of @max_tokens pieces, using the given
2369
 * @delimiter. If @max_tokens is reached, the remainder of @string is
2370
 * appended to the last token.
2371
 *
2372
 * As an example, the result of g_strsplit (":a:bc::d:", ":", -1) is a
2373
 * %NULL-terminated vector containing the six strings "", "a", "bc", "", "d"
2374
 * and "".
2375
 *
2376
 * As a special case, the result of splitting the empty string "" is an empty
2377
 * vector, not a vector containing a single string. The reason for this
2378
 * special case is that being able to represent an empty vector is typically
2379
 * more useful than consistent handling of empty elements. If you do need
2380
 * to represent empty elements, you'll need to check for the empty string
2381
 * before calling g_strsplit().
2382
 *
2383
 * Returns: a newly-allocated %NULL-terminated array of strings. Use
2384
 *    g_strfreev() to free it.
2385
 */
2386
gchar**
2387
g_strsplit (const gchar *string,
2388
            const gchar *delimiter,
2389
            gint         max_tokens)
2390
23.8k
{
2391
23.8k
  char *s;
2392
23.8k
  const gchar *remainder;
2393
23.8k
  GPtrArray *string_list;
2394
2395
23.8k
  g_return_val_if_fail (string != NULL, NULL);
2396
23.8k
  g_return_val_if_fail (delimiter != NULL, NULL);
2397
23.8k
  g_return_val_if_fail (delimiter[0] != '\0', NULL);
2398
2399
23.8k
  if (max_tokens < 1)
2400
4.28k
    max_tokens = G_MAXINT;
2401
2402
23.8k
  string_list = g_ptr_array_new ();
2403
23.8k
  remainder = string;
2404
23.8k
  s = strstr (remainder, delimiter);
2405
23.8k
  if (s)
2406
20.7k
    {
2407
20.7k
      gsize delimiter_len = strlen (delimiter);
2408
2409
100k
      while (--max_tokens && s)
2410
79.4k
        {
2411
79.4k
          gsize len;
2412
2413
79.4k
          len = s - remainder;
2414
79.4k
          g_ptr_array_add (string_list, g_strndup (remainder, len));
2415
79.4k
          remainder = s + delimiter_len;
2416
79.4k
          s = strstr (remainder, delimiter);
2417
79.4k
        }
2418
20.7k
    }
2419
23.8k
  if (*string)
2420
23.8k
    g_ptr_array_add (string_list, g_strdup (remainder));
2421
2422
23.8k
  g_ptr_array_add (string_list, NULL);
2423
2424
23.8k
  return (char **) g_ptr_array_free (string_list, FALSE);
2425
23.8k
}
2426
2427
/**
2428
 * g_strsplit_set:
2429
 * @string: The string to be tokenized
2430
 * @delimiters: A nul-terminated string containing bytes that are used
2431
 *     to split the string (it can accept an empty string, which will result
2432
 *     in no string splitting).
2433
 * @max_tokens: The maximum number of tokens to split @string into.
2434
 *     If this is less than 1, the string is split completely
2435
 *
2436
 * Splits @string into a number of tokens not containing any of the characters
2437
 * in @delimiter. A token is the (possibly empty) longest string that does not
2438
 * contain any of the characters in @delimiters. If @max_tokens is reached, the
2439
 * remainder is appended to the last token.
2440
 *
2441
 * For example the result of g_strsplit_set ("abc:def/ghi", ":/", -1) is a
2442
 * %NULL-terminated vector containing the three strings "abc", "def",
2443
 * and "ghi".
2444
 *
2445
 * The result of g_strsplit_set (":def/ghi:", ":/", -1) is a %NULL-terminated
2446
 * vector containing the four strings "", "def", "ghi", and "".
2447
 *
2448
 * As a special case, the result of splitting the empty string "" is an empty
2449
 * vector, not a vector containing a single string. The reason for this
2450
 * special case is that being able to represent an empty vector is typically
2451
 * more useful than consistent handling of empty elements. If you do need
2452
 * to represent empty elements, you'll need to check for the empty string
2453
 * before calling g_strsplit_set().
2454
 *
2455
 * Note that this function works on bytes not characters, so it can't be used
2456
 * to delimit UTF-8 strings for anything but ASCII characters.
2457
 *
2458
 * Returns: a newly-allocated %NULL-terminated array of strings. Use
2459
 *    g_strfreev() to free it.
2460
 *
2461
 * Since: 2.4
2462
 **/
2463
gchar **
2464
g_strsplit_set (const gchar *string,
2465
                const gchar *delimiters,
2466
                gint         max_tokens)
2467
0
{
2468
0
  guint8 delim_table[256]; /* 1 = index is a separator; 0 otherwise */
2469
0
  GSList *tokens, *list;
2470
0
  gint n_tokens;
2471
0
  const gchar *s;
2472
0
  const gchar *current;
2473
0
  gchar *token;
2474
0
  gchar **result;
2475
2476
0
  g_return_val_if_fail (string != NULL, NULL);
2477
0
  g_return_val_if_fail (delimiters != NULL, NULL);
2478
2479
0
  if (max_tokens < 1)
2480
0
    max_tokens = G_MAXINT;
2481
2482
0
  if (*string == '\0')
2483
0
    {
2484
0
      result = g_new (char *, 1);
2485
0
      result[0] = NULL;
2486
0
      return result;
2487
0
    }
2488
2489
  /* Check if each character in @string is a separator, by indexing by the
2490
   * character value into the @delim_table, which has value 1 stored at an index
2491
   * if that index is a separator. */
2492
0
  memset (delim_table, FALSE, sizeof (delim_table));
2493
0
  for (s = delimiters; *s != '\0'; ++s)
2494
0
    delim_table[*(guchar *)s] = TRUE;
2495
2496
0
  tokens = NULL;
2497
0
  n_tokens = 0;
2498
2499
0
  s = current = string;
2500
0
  while (*s != '\0')
2501
0
    {
2502
0
      if (delim_table[*(guchar *)s] && n_tokens + 1 < max_tokens)
2503
0
        {
2504
0
          token = g_strndup (current, s - current);
2505
0
          tokens = g_slist_prepend (tokens, token);
2506
0
          ++n_tokens;
2507
2508
0
          current = s + 1;
2509
0
        }
2510
2511
0
      ++s;
2512
0
    }
2513
2514
0
  token = g_strndup (current, s - current);
2515
0
  tokens = g_slist_prepend (tokens, token);
2516
0
  ++n_tokens;
2517
2518
0
  result = g_new (gchar *, n_tokens + 1);
2519
2520
0
  result[n_tokens] = NULL;
2521
0
  for (list = tokens; list != NULL; list = list->next)
2522
0
    result[--n_tokens] = list->data;
2523
2524
0
  g_slist_free (tokens);
2525
2526
0
  return result;
2527
0
}
2528
2529
/**
2530
 * GStrv:
2531
 *
2532
 * A typedef alias for gchar**. This is mostly useful when used together with
2533
 * g_auto().
2534
 */
2535
2536
/**
2537
 * g_strfreev:
2538
 * @str_array: (nullable): a %NULL-terminated array of strings to free
2539
 *
2540
 * Frees a %NULL-terminated array of strings, as well as each
2541
 * string it contains.
2542
 *
2543
 * If @str_array is %NULL, this function simply returns.
2544
 */
2545
void
2546
g_strfreev (gchar **str_array)
2547
23.8k
{
2548
23.8k
  if (str_array)
2549
23.8k
    {
2550
23.8k
      gsize i;
2551
2552
127k
      for (i = 0; str_array[i] != NULL; i++)
2553
103k
        g_free (str_array[i]);
2554
2555
23.8k
      g_free (str_array);
2556
23.8k
    }
2557
23.8k
}
2558
2559
/**
2560
 * g_strdupv:
2561
 * @str_array: (nullable): a %NULL-terminated array of strings
2562
 *
2563
 * Copies %NULL-terminated array of strings. The copy is a deep copy;
2564
 * the new array should be freed by first freeing each string, then
2565
 * the array itself. g_strfreev() does this for you. If called
2566
 * on a %NULL value, g_strdupv() simply returns %NULL.
2567
 *
2568
 * Returns: (nullable): a new %NULL-terminated array of strings.
2569
 */
2570
gchar**
2571
g_strdupv (gchar **str_array)
2572
0
{
2573
0
  if (str_array)
2574
0
    {
2575
0
      gsize i;
2576
0
      gchar **retval;
2577
2578
0
      i = 0;
2579
0
      while (str_array[i])
2580
0
        ++i;
2581
2582
0
      retval = g_new (gchar*, i + 1);
2583
2584
0
      i = 0;
2585
0
      while (str_array[i])
2586
0
        {
2587
0
          retval[i] = g_strdup (str_array[i]);
2588
0
          ++i;
2589
0
        }
2590
0
      retval[i] = NULL;
2591
2592
0
      return retval;
2593
0
    }
2594
0
  else
2595
0
    return NULL;
2596
0
}
2597
2598
/**
2599
 * g_strjoinv:
2600
 * @separator: (nullable): a string to insert between each of the
2601
 *     strings, or %NULL
2602
 * @str_array: a %NULL-terminated array of strings to join
2603
 *
2604
 * Joins a number of strings together to form one long string, with the
2605
 * optional @separator inserted between each of them. The returned string
2606
 * should be freed with g_free().
2607
 *
2608
 * If @str_array has no items, the return value will be an
2609
 * empty string. If @str_array contains a single item, @separator will not
2610
 * appear in the resulting string.
2611
 *
2612
 * Returns: a newly-allocated string containing all of the strings joined
2613
 *     together, with @separator between them
2614
 */
2615
gchar*
2616
g_strjoinv (const gchar  *separator,
2617
            gchar       **str_array)
2618
169k
{
2619
169k
  gchar *string;
2620
169k
  gchar *ptr;
2621
2622
169k
  g_return_val_if_fail (str_array != NULL, NULL);
2623
2624
169k
  if (separator == NULL)
2625
0
    separator = "";
2626
2627
169k
  if (*str_array)
2628
169k
    {
2629
169k
      gsize i;
2630
169k
      gsize len;
2631
169k
      gsize separator_len;
2632
2633
169k
      separator_len = strlen (separator);
2634
      /* First part, getting length */
2635
169k
      len = 1 + strlen (str_array[0]);
2636
339k
      for (i = 1; str_array[i] != NULL; i++)
2637
169k
        len += strlen (str_array[i]);
2638
169k
      len += separator_len * (i - 1);
2639
2640
      /* Second part, building string */
2641
169k
      string = g_new (gchar, len);
2642
169k
      ptr = g_stpcpy (string, *str_array);
2643
339k
      for (i = 1; str_array[i] != NULL; i++)
2644
169k
        {
2645
169k
          ptr = g_stpcpy (ptr, separator);
2646
169k
          ptr = g_stpcpy (ptr, str_array[i]);
2647
169k
        }
2648
169k
      }
2649
0
  else
2650
0
    string = g_strdup ("");
2651
2652
169k
  return string;
2653
169k
}
2654
2655
/**
2656
 * g_strjoin:
2657
 * @separator: (nullable): a string to insert between each of the
2658
 *     strings, or %NULL
2659
 * @...: a %NULL-terminated list of strings to join
2660
 *
2661
 * Joins a number of strings together to form one long string, with the
2662
 * optional @separator inserted between each of them. The returned string
2663
 * should be freed with g_free().
2664
 *
2665
 * Returns: a newly-allocated string containing all of the strings joined
2666
 *     together, with @separator between them
2667
 */
2668
gchar*
2669
g_strjoin (const gchar *separator,
2670
           ...)
2671
0
{
2672
0
  gchar *string, *s;
2673
0
  va_list args;
2674
0
  gsize len;
2675
0
  gsize separator_len;
2676
0
  gchar *ptr;
2677
2678
0
  if (separator == NULL)
2679
0
    separator = "";
2680
2681
0
  separator_len = strlen (separator);
2682
2683
0
  va_start (args, separator);
2684
2685
0
  s = va_arg (args, gchar*);
2686
2687
0
  if (s)
2688
0
    {
2689
      /* First part, getting length */
2690
0
      len = 1 + strlen (s);
2691
2692
0
      s = va_arg (args, gchar*);
2693
0
      while (s)
2694
0
        {
2695
0
          len += separator_len + strlen (s);
2696
0
          s = va_arg (args, gchar*);
2697
0
        }
2698
0
      va_end (args);
2699
2700
      /* Second part, building string */
2701
0
      string = g_new (gchar, len);
2702
2703
0
      va_start (args, separator);
2704
2705
0
      s = va_arg (args, gchar*);
2706
0
      ptr = g_stpcpy (string, s);
2707
2708
0
      s = va_arg (args, gchar*);
2709
0
      while (s)
2710
0
        {
2711
0
          ptr = g_stpcpy (ptr, separator);
2712
0
          ptr = g_stpcpy (ptr, s);
2713
0
          s = va_arg (args, gchar*);
2714
0
        }
2715
0
    }
2716
0
  else
2717
0
    string = g_strdup ("");
2718
2719
0
  va_end (args);
2720
2721
0
  return string;
2722
0
}
2723
2724
2725
/**
2726
 * g_strstr_len:
2727
 * @haystack: a nul-terminated string
2728
 * @haystack_len: the maximum length of @haystack in bytes. A length of -1
2729
 *     can be used to mean "search the entire string", like `strstr()`.
2730
 * @needle: the string to search for
2731
 *
2732
 * Searches the string @haystack for the first occurrence
2733
 * of the string @needle, limiting the length of the search
2734
 * to @haystack_len.
2735
 *
2736
 * Returns: a pointer to the found occurrence, or
2737
 *    %NULL if not found.
2738
 */
2739
gchar *
2740
g_strstr_len (const gchar *haystack,
2741
              gssize       haystack_len,
2742
              const gchar *needle)
2743
7.33M
{
2744
7.33M
  g_return_val_if_fail (haystack != NULL, NULL);
2745
7.33M
  g_return_val_if_fail (needle != NULL, NULL);
2746
2747
7.33M
  if (haystack_len < 0)
2748
7.33M
    return strstr (haystack, needle);
2749
0
  else
2750
0
    {
2751
0
      const gchar *p = haystack;
2752
0
      gsize needle_len = strlen (needle);
2753
0
      gsize haystack_len_unsigned = haystack_len;
2754
0
      const gchar *end;
2755
0
      gsize i;
2756
2757
0
      if (needle_len == 0)
2758
0
        return (gchar *)haystack;
2759
2760
0
      if (haystack_len_unsigned < needle_len)
2761
0
        return NULL;
2762
2763
0
      end = haystack + haystack_len - needle_len;
2764
2765
0
      while (p <= end && *p)
2766
0
        {
2767
0
          for (i = 0; i < needle_len; i++)
2768
0
            if (p[i] != needle[i])
2769
0
              goto next;
2770
2771
0
          return (gchar *)p;
2772
2773
0
        next:
2774
0
          p++;
2775
0
        }
2776
2777
0
      return NULL;
2778
0
    }
2779
7.33M
}
2780
2781
/**
2782
 * g_strrstr:
2783
 * @haystack: a nul-terminated string
2784
 * @needle: the nul-terminated string to search for
2785
 *
2786
 * Searches the string @haystack for the last occurrence
2787
 * of the string @needle.
2788
 *
2789
 * Returns: a pointer to the found occurrence, or
2790
 *    %NULL if not found.
2791
 */
2792
gchar *
2793
g_strrstr (const gchar *haystack,
2794
           const gchar *needle)
2795
0
{
2796
0
  gsize i;
2797
0
  gsize needle_len;
2798
0
  gsize haystack_len;
2799
0
  const gchar *p;
2800
2801
0
  g_return_val_if_fail (haystack != NULL, NULL);
2802
0
  g_return_val_if_fail (needle != NULL, NULL);
2803
2804
0
  needle_len = strlen (needle);
2805
0
  haystack_len = strlen (haystack);
2806
2807
0
  if (needle_len == 0)
2808
0
    return (gchar *)haystack;
2809
2810
0
  if (haystack_len < needle_len)
2811
0
    return NULL;
2812
2813
0
  p = haystack + haystack_len - needle_len;
2814
2815
0
  while (p >= haystack)
2816
0
    {
2817
0
      for (i = 0; i < needle_len; i++)
2818
0
        if (p[i] != needle[i])
2819
0
          goto next;
2820
2821
0
      return (gchar *)p;
2822
2823
0
    next:
2824
0
      p--;
2825
0
    }
2826
2827
0
  return NULL;
2828
0
}
2829
2830
/**
2831
 * g_strrstr_len:
2832
 * @haystack: a nul-terminated string
2833
 * @haystack_len: the maximum length of @haystack in bytes. A length of -1
2834
 *     can be used to mean "search the entire string", like g_strrstr().
2835
 * @needle: the nul-terminated string to search for
2836
 *
2837
 * Searches the string @haystack for the last occurrence
2838
 * of the string @needle, limiting the length of the search
2839
 * to @haystack_len.
2840
 *
2841
 * Returns: a pointer to the found occurrence, or
2842
 *    %NULL if not found.
2843
 */
2844
gchar *
2845
g_strrstr_len (const gchar *haystack,
2846
               gssize        haystack_len,
2847
               const gchar *needle)
2848
0
{
2849
0
  g_return_val_if_fail (haystack != NULL, NULL);
2850
0
  g_return_val_if_fail (needle != NULL, NULL);
2851
2852
0
  if (haystack_len < 0)
2853
0
    return g_strrstr (haystack, needle);
2854
0
  else
2855
0
    {
2856
0
      gsize needle_len = strlen (needle);
2857
0
      const gchar *haystack_max = haystack + haystack_len;
2858
0
      const gchar *p = haystack;
2859
0
      gsize i;
2860
2861
0
      while (p < haystack_max && *p)
2862
0
        p++;
2863
2864
0
      if (p < haystack + needle_len)
2865
0
        return NULL;
2866
2867
0
      p -= needle_len;
2868
2869
0
      while (p >= haystack)
2870
0
        {
2871
0
          for (i = 0; i < needle_len; i++)
2872
0
            if (p[i] != needle[i])
2873
0
              goto next;
2874
2875
0
          return (gchar *)p;
2876
2877
0
        next:
2878
0
          p--;
2879
0
        }
2880
2881
0
      return NULL;
2882
0
    }
2883
0
}
2884
2885
2886
/**
2887
 * g_str_has_suffix:
2888
 * @str: a nul-terminated string
2889
 * @suffix: the nul-terminated suffix to look for
2890
 *
2891
 * Looks whether the string @str ends with @suffix.
2892
 *
2893
 * Returns: %TRUE if @str end with @suffix, %FALSE otherwise.
2894
 *
2895
 * Since: 2.2
2896
 */
2897
gboolean
2898
g_str_has_suffix (const gchar *str,
2899
                  const gchar *suffix)
2900
0
{
2901
0
  gsize str_len;
2902
0
  gsize suffix_len;
2903
2904
0
  g_return_val_if_fail (str != NULL, FALSE);
2905
0
  g_return_val_if_fail (suffix != NULL, FALSE);
2906
2907
0
  str_len = strlen (str);
2908
0
  suffix_len = strlen (suffix);
2909
2910
0
  if (str_len < suffix_len)
2911
0
    return FALSE;
2912
2913
0
  return strcmp (str + str_len - suffix_len, suffix) == 0;
2914
0
}
2915
2916
/**
2917
 * g_str_has_prefix:
2918
 * @str: a nul-terminated string
2919
 * @prefix: the nul-terminated prefix to look for
2920
 *
2921
 * Looks whether the string @str begins with @prefix.
2922
 *
2923
 * Returns: %TRUE if @str begins with @prefix, %FALSE otherwise.
2924
 *
2925
 * Since: 2.2
2926
 */
2927
gboolean
2928
g_str_has_prefix (const gchar *str,
2929
                  const gchar *prefix)
2930
12.9M
{
2931
12.9M
  g_return_val_if_fail (str != NULL, FALSE);
2932
12.9M
  g_return_val_if_fail (prefix != NULL, FALSE);
2933
2934
12.9M
  return strncmp (str, prefix, strlen (prefix)) == 0;
2935
12.9M
}
2936
2937
/**
2938
 * g_strv_length:
2939
 * @str_array: a %NULL-terminated array of strings
2940
 *
2941
 * Returns the length of the given %NULL-terminated
2942
 * string array @str_array. @str_array must not be %NULL.
2943
 *
2944
 * Returns: length of @str_array.
2945
 *
2946
 * Since: 2.6
2947
 */
2948
guint
2949
g_strv_length (gchar **str_array)
2950
19.5k
{
2951
19.5k
  guint i = 0;
2952
2953
19.5k
  g_return_val_if_fail (str_array != NULL, 0);
2954
2955
116k
  while (str_array[i])
2956
96.9k
    ++i;
2957
2958
19.5k
  return i;
2959
19.5k
}
2960
2961
static void
2962
index_add_folded (GPtrArray   *array,
2963
                  const gchar *start,
2964
                  const gchar *end)
2965
0
{
2966
0
  gchar *normal;
2967
2968
0
  normal = g_utf8_normalize (start, end - start, G_NORMALIZE_ALL_COMPOSE);
2969
2970
  /* TODO: Invent time machine.  Converse with Mustafa Ataturk... */
2971
0
  if (strstr (normal, "ı") || strstr (normal, "İ"))
2972
0
    {
2973
0
      gchar *s = normal;
2974
0
      GString *tmp;
2975
2976
0
      tmp = g_string_new (NULL);
2977
2978
0
      while (*s)
2979
0
        {
2980
0
          gchar *i, *I, *e;
2981
2982
0
          i = strstr (s, "ı");
2983
0
          I = strstr (s, "İ");
2984
2985
0
          if (!i && !I)
2986
0
            break;
2987
0
          else if (i && !I)
2988
0
            e = i;
2989
0
          else if (I && !i)
2990
0
            e = I;
2991
0
          else if (i < I)
2992
0
            e = i;
2993
0
          else
2994
0
            e = I;
2995
2996
0
          g_string_append_len (tmp, s, e - s);
2997
0
          g_string_append_c (tmp, 'i');
2998
0
          s = g_utf8_next_char (e);
2999
0
        }
3000
3001
0
      g_string_append (tmp, s);
3002
0
      g_free (normal);
3003
0
      normal = g_string_free (tmp, FALSE);
3004
0
    }
3005
3006
0
  g_ptr_array_add (array, g_utf8_casefold (normal, -1));
3007
0
  g_free (normal);
3008
0
}
3009
3010
static gchar **
3011
split_words (const gchar *value)
3012
0
{
3013
0
  const gchar *start = NULL;
3014
0
  GPtrArray *result;
3015
0
  const gchar *s;
3016
3017
0
  result = g_ptr_array_new ();
3018
3019
0
  for (s = value; *s; s = g_utf8_next_char (s))
3020
0
    {
3021
0
      gunichar c = g_utf8_get_char (s);
3022
3023
0
      if (start == NULL)
3024
0
        {
3025
0
          if (g_unichar_isalnum (c) || g_unichar_ismark (c))
3026
0
            start = s;
3027
0
        }
3028
0
      else
3029
0
        {
3030
0
          if (!g_unichar_isalnum (c) && !g_unichar_ismark (c))
3031
0
            {
3032
0
              index_add_folded (result, start, s);
3033
0
              start = NULL;
3034
0
            }
3035
0
        }
3036
0
    }
3037
3038
0
  if (start)
3039
0
    index_add_folded (result, start, s);
3040
3041
0
  g_ptr_array_add (result, NULL);
3042
3043
0
  return (gchar **) g_ptr_array_free (result, FALSE);
3044
0
}
3045
3046
/**
3047
 * g_str_tokenize_and_fold:
3048
 * @string: a string
3049
 * @translit_locale: (nullable): the language code (like 'de' or
3050
 *   'en_GB') from which @string originates
3051
 * @ascii_alternates: (out) (transfer full) (array zero-terminated=1): a
3052
 *   return location for ASCII alternates
3053
 *
3054
 * Tokenises @string and performs folding on each token.
3055
 *
3056
 * A token is a non-empty sequence of alphanumeric characters in the
3057
 * source string, separated by non-alphanumeric characters.  An
3058
 * "alphanumeric" character for this purpose is one that matches
3059
 * g_unichar_isalnum() or g_unichar_ismark().
3060
 *
3061
 * Each token is then (Unicode) normalised and case-folded.  If
3062
 * @ascii_alternates is non-%NULL and some of the returned tokens
3063
 * contain non-ASCII characters, ASCII alternatives will be generated.
3064
 *
3065
 * The number of ASCII alternatives that are generated and the method
3066
 * for doing so is unspecified, but @translit_locale (if specified) may
3067
 * improve the transliteration if the language of the source string is
3068
 * known.
3069
 *
3070
 * Returns: (transfer full) (array zero-terminated=1): the folded tokens
3071
 *
3072
 * Since: 2.40
3073
 **/
3074
gchar **
3075
g_str_tokenize_and_fold (const gchar   *string,
3076
                         const gchar   *translit_locale,
3077
                         gchar       ***ascii_alternates)
3078
0
{
3079
0
  gchar **result;
3080
3081
0
  g_return_val_if_fail (string != NULL, NULL);
3082
3083
0
  if (ascii_alternates && g_str_is_ascii (string))
3084
0
    {
3085
0
      *ascii_alternates = g_new0 (gchar *, 0 + 1);
3086
0
      ascii_alternates = NULL;
3087
0
    }
3088
3089
0
  result = split_words (string);
3090
3091
0
  if (ascii_alternates)
3092
0
    {
3093
0
      gint i, j, n;
3094
3095
0
      n = g_strv_length (result);
3096
0
      *ascii_alternates = g_new (gchar *, n + 1);
3097
0
      j = 0;
3098
3099
0
      for (i = 0; i < n; i++)
3100
0
        {
3101
0
          if (!g_str_is_ascii (result[i]))
3102
0
            {
3103
0
              gchar *composed;
3104
0
              gchar *ascii;
3105
0
              gint k;
3106
3107
0
              composed = g_utf8_normalize (result[i], -1, G_NORMALIZE_ALL_COMPOSE);
3108
3109
0
              ascii = g_str_to_ascii (composed, translit_locale);
3110
3111
              /* Only accept strings that are now entirely alnums */
3112
0
              for (k = 0; ascii[k]; k++)
3113
0
                if (!g_ascii_isalnum (ascii[k]))
3114
0
                  break;
3115
3116
0
              if (ascii[k] == '\0')
3117
                /* Made it to the end... */
3118
0
                (*ascii_alternates)[j++] = ascii;
3119
0
              else
3120
0
                g_free (ascii);
3121
3122
0
              g_free (composed);
3123
0
            }
3124
0
        }
3125
3126
0
      (*ascii_alternates)[j] = NULL;
3127
0
    }
3128
3129
0
  return result;
3130
0
}
3131
3132
/**
3133
 * g_str_match_string:
3134
 * @search_term: the search term from the user
3135
 * @potential_hit: the text that may be a hit
3136
 * @accept_alternates: %TRUE to accept ASCII alternates
3137
 *
3138
 * Checks if a search conducted for @search_term should match
3139
 * @potential_hit.
3140
 *
3141
 * This function calls g_str_tokenize_and_fold() on both
3142
 * @search_term and @potential_hit.  ASCII alternates are never taken
3143
 * for @search_term but will be taken for @potential_hit according to
3144
 * the value of @accept_alternates.
3145
 *
3146
 * A hit occurs when each folded token in @search_term is a prefix of a
3147
 * folded token from @potential_hit.
3148
 *
3149
 * Depending on how you're performing the search, it will typically be
3150
 * faster to call g_str_tokenize_and_fold() on each string in
3151
 * your corpus and build an index on the returned folded tokens, then
3152
 * call g_str_tokenize_and_fold() on the search term and
3153
 * perform lookups into that index.
3154
 *
3155
 * As some examples, searching for ‘fred’ would match the potential hit
3156
 * ‘Smith, Fred’ and also ‘Frédéric’.  Searching for ‘Fréd’ would match
3157
 * ‘Frédéric’ but not ‘Frederic’ (due to the one-directional nature of
3158
 * accent matching).  Searching ‘fo’ would match ‘Foo’ and ‘Bar Foo
3159
 * Baz’, but not ‘SFO’ (because no word has ‘fo’ as a prefix).
3160
 *
3161
 * Returns: %TRUE if @potential_hit is a hit
3162
 *
3163
 * Since: 2.40
3164
 **/
3165
gboolean
3166
g_str_match_string (const gchar *search_term,
3167
                    const gchar *potential_hit,
3168
                    gboolean     accept_alternates)
3169
0
{
3170
0
  gchar **alternates = NULL;
3171
0
  gchar **term_tokens;
3172
0
  gchar **hit_tokens;
3173
0
  gboolean matched;
3174
0
  gint i, j;
3175
3176
0
  g_return_val_if_fail (search_term != NULL, FALSE);
3177
0
  g_return_val_if_fail (potential_hit != NULL, FALSE);
3178
3179
0
  term_tokens = g_str_tokenize_and_fold (search_term, NULL, NULL);
3180
0
  hit_tokens = g_str_tokenize_and_fold (potential_hit, NULL, accept_alternates ? &alternates : NULL);
3181
3182
0
  matched = TRUE;
3183
3184
0
  for (i = 0; term_tokens[i]; i++)
3185
0
    {
3186
0
      for (j = 0; hit_tokens[j]; j++)
3187
0
        if (g_str_has_prefix (hit_tokens[j], term_tokens[i]))
3188
0
          goto one_matched;
3189
3190
0
      if (accept_alternates)
3191
0
        for (j = 0; alternates[j]; j++)
3192
0
          if (g_str_has_prefix (alternates[j], term_tokens[i]))
3193
0
            goto one_matched;
3194
3195
0
      matched = FALSE;
3196
0
      break;
3197
3198
0
one_matched:
3199
0
      continue;
3200
0
    }
3201
3202
0
  g_strfreev (term_tokens);
3203
0
  g_strfreev (hit_tokens);
3204
0
  g_strfreev (alternates);
3205
3206
0
  return matched;
3207
0
}
3208
3209
/**
3210
 * g_strv_contains:
3211
 * @strv: a %NULL-terminated array of strings
3212
 * @str: a string
3213
 *
3214
 * Checks if @strv contains @str. @strv must not be %NULL.
3215
 *
3216
 * Returns: %TRUE if @str is an element of @strv, according to g_str_equal().
3217
 *
3218
 * Since: 2.44
3219
 */
3220
gboolean
3221
g_strv_contains (const gchar * const *strv,
3222
                 const gchar         *str)
3223
0
{
3224
0
  g_return_val_if_fail (strv != NULL, FALSE);
3225
0
  g_return_val_if_fail (str != NULL, FALSE);
3226
3227
0
  for (; *strv != NULL; strv++)
3228
0
    {
3229
0
      if (g_str_equal (str, *strv))
3230
0
        return TRUE;
3231
0
    }
3232
3233
0
  return FALSE;
3234
0
}
3235
3236
/**
3237
 * g_strv_equal:
3238
 * @strv1: a %NULL-terminated array of strings
3239
 * @strv2: another %NULL-terminated array of strings
3240
 *
3241
 * Checks if @strv1 and @strv2 contain exactly the same elements in exactly the
3242
 * same order. Elements are compared using g_str_equal(). To match independently
3243
 * of order, sort the arrays first (using g_qsort_with_data() or similar).
3244
 *
3245
 * Two empty arrays are considered equal. Neither @strv1 not @strv2 may be
3246
 * %NULL.
3247
 *
3248
 * Returns: %TRUE if @strv1 and @strv2 are equal
3249
 * Since: 2.60
3250
 */
3251
gboolean
3252
g_strv_equal (const gchar * const *strv1,
3253
              const gchar * const *strv2)
3254
0
{
3255
0
  g_return_val_if_fail (strv1 != NULL, FALSE);
3256
0
  g_return_val_if_fail (strv2 != NULL, FALSE);
3257
3258
0
  if (strv1 == strv2)
3259
0
    return TRUE;
3260
3261
0
  for (; *strv1 != NULL && *strv2 != NULL; strv1++, strv2++)
3262
0
    {
3263
0
      if (!g_str_equal (*strv1, *strv2))
3264
0
        return FALSE;
3265
0
    }
3266
3267
0
  return (*strv1 == NULL && *strv2 == NULL);
3268
0
}
3269
3270
static gboolean
3271
str_has_sign (const gchar *str)
3272
184k
{
3273
184k
  return str[0] == '-' || str[0] == '+';
3274
184k
}
3275
3276
static gboolean
3277
str_has_hex_prefix (const gchar *str)
3278
184k
{
3279
184k
  return str[0] == '0' && g_ascii_tolower (str[1]) == 'x';
3280
184k
}
3281
3282
/**
3283
 * g_ascii_string_to_signed:
3284
 * @str: a string
3285
 * @base: base of a parsed number
3286
 * @min: a lower bound (inclusive)
3287
 * @max: an upper bound (inclusive)
3288
 * @out_num: (out) (optional): a return location for a number
3289
 * @error: a return location for #GError
3290
 *
3291
 * A convenience function for converting a string to a signed number.
3292
 *
3293
 * This function assumes that @str contains only a number of the given
3294
 * @base that is within inclusive bounds limited by @min and @max. If
3295
 * this is true, then the converted number is stored in @out_num. An
3296
 * empty string is not a valid input. A string with leading or
3297
 * trailing whitespace is also an invalid input.
3298
 *
3299
 * @base can be between 2 and 36 inclusive. Hexadecimal numbers must
3300
 * not be prefixed with "0x" or "0X". Such a problem does not exist
3301
 * for octal numbers, since they were usually prefixed with a zero
3302
 * which does not change the value of the parsed number.
3303
 *
3304
 * Parsing failures result in an error with the %G_NUMBER_PARSER_ERROR
3305
 * domain. If the input is invalid, the error code will be
3306
 * %G_NUMBER_PARSER_ERROR_INVALID. If the parsed number is out of
3307
 * bounds - %G_NUMBER_PARSER_ERROR_OUT_OF_BOUNDS.
3308
 *
3309
 * See g_ascii_strtoll() if you have more complex needs such as
3310
 * parsing a string which starts with a number, but then has other
3311
 * characters.
3312
 *
3313
 * Returns: %TRUE if @str was a number, otherwise %FALSE.
3314
 *
3315
 * Since: 2.54
3316
 */
3317
gboolean
3318
g_ascii_string_to_signed (const gchar  *str,
3319
                          guint         base,
3320
                          gint64        min,
3321
                          gint64        max,
3322
                          gint64       *out_num,
3323
                          GError      **error)
3324
0
{
3325
0
  gint64 number;
3326
0
  const gchar *end_ptr = NULL;
3327
0
  gint saved_errno = 0;
3328
3329
0
  g_return_val_if_fail (str != NULL, FALSE);
3330
0
  g_return_val_if_fail (base >= 2 && base <= 36, FALSE);
3331
0
  g_return_val_if_fail (min <= max, FALSE);
3332
0
  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
3333
3334
0
  if (str[0] == '\0')
3335
0
    {
3336
0
      g_set_error_literal (error,
3337
0
                           G_NUMBER_PARSER_ERROR, G_NUMBER_PARSER_ERROR_INVALID,
3338
0
                           _("Empty string is not a number"));
3339
0
      return FALSE;
3340
0
    }
3341
3342
0
  errno = 0;
3343
0
  number = g_ascii_strtoll (str, (gchar **)&end_ptr, base);
3344
0
  saved_errno = errno;
3345
3346
0
  if (/* We do not allow leading whitespace, but g_ascii_strtoll
3347
       * accepts it and just skips it, so we need to check for it
3348
       * ourselves.
3349
       */
3350
0
      g_ascii_isspace (str[0]) ||
3351
      /* We don't support hexadecimal numbers prefixed with 0x or
3352
       * 0X.
3353
       */
3354
0
      (base == 16 &&
3355
0
       (str_has_sign (str) ? str_has_hex_prefix (str + 1) : str_has_hex_prefix (str))) ||
3356
0
      (saved_errno != 0 && saved_errno != ERANGE) ||
3357
0
      end_ptr == NULL ||
3358
0
      *end_ptr != '\0')
3359
0
    {
3360
0
      g_set_error (error,
3361
0
                   G_NUMBER_PARSER_ERROR, G_NUMBER_PARSER_ERROR_INVALID,
3362
0
                   _("“%s” is not a signed number"), str);
3363
0
      return FALSE;
3364
0
    }
3365
0
  if (saved_errno == ERANGE || number < min || number > max)
3366
0
    {
3367
0
      gchar *min_str = g_strdup_printf ("%" G_GINT64_FORMAT, min);
3368
0
      gchar *max_str = g_strdup_printf ("%" G_GINT64_FORMAT, max);
3369
3370
0
      g_set_error (error,
3371
0
                   G_NUMBER_PARSER_ERROR, G_NUMBER_PARSER_ERROR_OUT_OF_BOUNDS,
3372
0
                   _("Number “%s” is out of bounds [%s, %s]"),
3373
0
                   str, min_str, max_str);
3374
0
      g_free (min_str);
3375
0
      g_free (max_str);
3376
0
      return FALSE;
3377
0
    }
3378
0
  if (out_num != NULL)
3379
0
    *out_num = number;
3380
0
  return TRUE;
3381
0
}
3382
3383
/**
3384
 * g_ascii_string_to_unsigned:
3385
 * @str: a string
3386
 * @base: base of a parsed number
3387
 * @min: a lower bound (inclusive)
3388
 * @max: an upper bound (inclusive)
3389
 * @out_num: (out) (optional): a return location for a number
3390
 * @error: a return location for #GError
3391
 *
3392
 * A convenience function for converting a string to an unsigned number.
3393
 *
3394
 * This function assumes that @str contains only a number of the given
3395
 * @base that is within inclusive bounds limited by @min and @max. If
3396
 * this is true, then the converted number is stored in @out_num. An
3397
 * empty string is not a valid input. A string with leading or
3398
 * trailing whitespace is also an invalid input. A string with a leading sign
3399
 * (`-` or `+`) is not a valid input for the unsigned parser.
3400
 *
3401
 * @base can be between 2 and 36 inclusive. Hexadecimal numbers must
3402
 * not be prefixed with "0x" or "0X". Such a problem does not exist
3403
 * for octal numbers, since they were usually prefixed with a zero
3404
 * which does not change the value of the parsed number.
3405
 *
3406
 * Parsing failures result in an error with the %G_NUMBER_PARSER_ERROR
3407
 * domain. If the input is invalid, the error code will be
3408
 * %G_NUMBER_PARSER_ERROR_INVALID. If the parsed number is out of
3409
 * bounds - %G_NUMBER_PARSER_ERROR_OUT_OF_BOUNDS.
3410
 *
3411
 * See g_ascii_strtoull() if you have more complex needs such as
3412
 * parsing a string which starts with a number, but then has other
3413
 * characters.
3414
 *
3415
 * Returns: %TRUE if @str was a number, otherwise %FALSE.
3416
 *
3417
 * Since: 2.54
3418
 */
3419
gboolean
3420
g_ascii_string_to_unsigned (const gchar  *str,
3421
                            guint         base,
3422
                            guint64       min,
3423
                            guint64       max,
3424
                            guint64      *out_num,
3425
                            GError      **error)
3426
184k
{
3427
184k
  guint64 number;
3428
184k
  const gchar *end_ptr = NULL;
3429
184k
  gint saved_errno = 0;
3430
3431
184k
  g_return_val_if_fail (str != NULL, FALSE);
3432
184k
  g_return_val_if_fail (base >= 2 && base <= 36, FALSE);
3433
184k
  g_return_val_if_fail (min <= max, FALSE);
3434
184k
  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
3435
3436
184k
  if (str[0] == '\0')
3437
0
    {
3438
0
      g_set_error_literal (error,
3439
0
                           G_NUMBER_PARSER_ERROR, G_NUMBER_PARSER_ERROR_INVALID,
3440
0
                           _("Empty string is not a number"));
3441
0
      return FALSE;
3442
0
    }
3443
3444
184k
  errno = 0;
3445
184k
  number = g_ascii_strtoull (str, (gchar **)&end_ptr, base);
3446
184k
  saved_errno = errno;
3447
3448
184k
  if (/* We do not allow leading whitespace, but g_ascii_strtoull
3449
       * accepts it and just skips it, so we need to check for it
3450
       * ourselves.
3451
       */
3452
184k
      g_ascii_isspace (str[0]) ||
3453
      /* Unsigned number should have no sign.
3454
       */
3455
184k
      str_has_sign (str) ||
3456
      /* We don't support hexadecimal numbers prefixed with 0x or
3457
       * 0X.
3458
       */
3459
184k
      (base == 16 && str_has_hex_prefix (str)) ||
3460
183k
      (saved_errno != 0 && saved_errno != ERANGE) ||
3461
183k
      end_ptr == NULL ||
3462
183k
      *end_ptr != '\0')
3463
333
    {
3464
333
      g_set_error (error,
3465
333
                   G_NUMBER_PARSER_ERROR, G_NUMBER_PARSER_ERROR_INVALID,
3466
333
                   _("“%s” is not an unsigned number"), str);
3467
333
      return FALSE;
3468
333
    }
3469
183k
  if (saved_errno == ERANGE || number < min || number > max)
3470
0
    {
3471
0
      gchar *min_str = g_strdup_printf ("%" G_GUINT64_FORMAT, min);
3472
0
      gchar *max_str = g_strdup_printf ("%" G_GUINT64_FORMAT, max);
3473
3474
0
      g_set_error (error,
3475
0
                   G_NUMBER_PARSER_ERROR, G_NUMBER_PARSER_ERROR_OUT_OF_BOUNDS,
3476
0
                   _("Number “%s” is out of bounds [%s, %s]"),
3477
0
                   str, min_str, max_str);
3478
0
      g_free (min_str);
3479
0
      g_free (max_str);
3480
0
      return FALSE;
3481
0
    }
3482
183k
  if (out_num != NULL)
3483
183k
    *out_num = number;
3484
183k
  return TRUE;
3485
183k
}
3486
3487
G_DEFINE_QUARK (g-number-parser-error-quark, g_number_parser_error)