465
/* counts how many characters to escape in @str. */
467
count_chars_to_escape (const char *str,
468
const char *meta_chars)
470
int meta_chars_n = strlen (meta_chars);
474
for (s = str; *s != 0; s++) {
476
for (i = 0; i < meta_chars_n; i++)
477
if (*s == meta_chars[i]) {
487
strchrs (const char *str,
491
for (c = chars; *c != '\0'; c++)
492
if (strchr (str, *c) != NULL)
499
escape_str_common (const char *str,
500
const char *meta_chars,
504
int meta_chars_n = strlen (meta_chars);
506
int i, new_l, extra_chars = 0;
518
new_l = strlen (str) + (count_chars_to_escape (str, meta_chars) * extra_chars);
519
escaped = g_malloc (new_l + 1);
524
gboolean is_bad = FALSE;
525
for (i = 0; (i < meta_chars_n) && !is_bad; i++)
526
is_bad = (*s == meta_chars[i]);
527
if (is_bad && prefix)
530
if (is_bad && postfix)
539
/* escape with backslash the string @str. */
541
escape_str (const char *str,
542
const char *meta_chars)
544
return escape_str_common (str, meta_chars, '\\', 0);
548
/* remove backslashes from a string. */
550
unescape_str (const char *str)
559
new_str = g_malloc (strlen (str) + 1);
574
/* escape with backslash the file name. */
576
shell_escape (const char *filename)
578
return escape_str (filename, "$\'`\"\\!?* ()[]&|@#:;");
583
match_patterns (char **patterns,
590
if (patterns[0] == NULL)
596
result = FNM_NOMATCH;
598
while ((result != 0) && (patterns[i] != NULL)) {
599
result = g_utf8_fnmatch (patterns[i], string, flags);
603
return (result == 0);
608
g_utf8_strstr (const char *haystack, const char *needle)
612
gsize haystack_len = g_utf8_strlen (haystack, -1);
613
gsize needle_len = g_utf8_strlen (needle, -1);
614
int needle_size = strlen (needle);
617
for (i = 0; i <= haystack_len - needle_len; i++) {
618
if (strncmp (s, needle, needle_size) == 0)
620
s = g_utf8_next_char(s);
628
g_utf8_strsplit (const char *string,
629
const char *delimiter,
632
GSList *string_list = NULL, *slist;
636
const char *remainder;
638
g_return_val_if_fail (string != NULL, NULL);
639
g_return_val_if_fail (delimiter != NULL, NULL);
640
g_return_val_if_fail (delimiter[0] != '\0', NULL);
643
max_tokens = G_MAXINT;
646
s = g_utf8_strstr (remainder, delimiter);
648
gsize delimiter_size = strlen (delimiter);
650
while (--max_tokens && (s != NULL)) {
651
gsize size = s - remainder;
654
new_string = g_new (char, size + 1);
655
strncpy (new_string, remainder, size);
656
new_string[size] = 0;
658
string_list = g_slist_prepend (string_list, new_string);
660
remainder = s + delimiter_size;
661
s = g_utf8_strstr (remainder, delimiter);
666
string_list = g_slist_prepend (string_list, g_strdup (remainder));
669
str_array = g_new (char*, n + 1);
671
str_array[n--] = NULL;
672
for (slist = string_list; slist; slist = slist->next)
673
str_array[n--] = slist->data;
675
g_slist_free (string_list);
682
g_utf8_strchug (char *string)
687
g_return_val_if_fail (string != NULL, NULL);
690
c = g_utf8_get_char (scan);
691
while (g_unichar_isspace (c)) {
692
scan = g_utf8_next_char (scan);
693
c = g_utf8_get_char (scan);
696
g_memmove (string, scan, strlen (scan) + 1);
703
g_utf8_strchomp (char *string)
708
g_return_val_if_fail (string != NULL, NULL);
710
len = g_utf8_strlen (string, -1);
715
scan = g_utf8_offset_to_pointer (string, len - 1);
718
gunichar c = g_utf8_get_char (scan);
719
if (g_unichar_isspace (c))
723
scan = g_utf8_find_prev_char (string, scan);
730
#define g_utf8_strstrip(string) g_utf8_strchomp (g_utf8_strchug (string))
734
search_util_get_patterns (const char *pattern_string)
739
patterns = g_utf8_strsplit (pattern_string, ";", MAX_PATTERNS);
740
for (i = 0; patterns[i] != NULL; i++)
741
patterns[i] = g_utf8_strstrip (patterns[i]);
748
465
get_dest_free_space (const char *path)
863
_g_strdup_with_max_size (const char *s,
873
int half_max_size = max_size / 2 + 1;
875
first_half = g_strndup (s, half_max_size);
876
offset = half_max_size + l - max_size;
877
second_half = g_strndup (s + offset, half_max_size);
879
result = g_strconcat (first_half, "...", second_half, NULL);
882
g_free (second_half);
884
result = g_strdup (s);
891
eat_spaces (const char *line)
895
while ((*line == ' ') && (*line != 0))
902
split_line (const char *line,
906
const char *scan, *field_end;
909
fields = g_new0 (char *, n_fields + 1);
910
fields[n_fields] = NULL;
912
scan = eat_spaces (line);
913
for (i = 0; i < n_fields; i++) {
918
field_end = strchr (scan, ' ');
919
if (field_end != NULL) {
920
fields[i] = g_strndup (scan, field_end - scan);
921
scan = eat_spaces (field_end);
930
get_last_field (const char *line,
940
field = eat_spaces (line);
941
for (i = 0; i < last_field; i++) {
944
field = strchr (field, ' ');
945
field = eat_spaces (field);
953
580
get_temp_work_dir (void)
955
582
char temp_dir_template[] = "/tmp/fr-XXXXXX";