Coverage Report

Created: 2025-06-13 06:55

/src/glib/gio/xdgmime/xdgmimealias.c
Line
Count
Source (jump to first uncovered line)
1
/* -*- mode: C; c-file-style: "gnu" -*- */
2
/* xdgmimealias.c: Private file.  Datastructure for storing the aliases.
3
 *
4
 * More info can be found at http://www.freedesktop.org/standards/
5
 *
6
 * Copyright (C) 2004  Red Hat, Inc.
7
 * Copyright (C) 2004  Matthias Clasen <mclasen@redhat.com>
8
 *
9
 * SPDX-License-Identifier: LGPL-2.1-or-later or AFL-2.0
10
 */
11
12
#ifdef HAVE_CONFIG_H
13
#include <config.h>
14
#endif
15
16
#include "xdgmimealias.h"
17
#include "xdgmimeint.h"
18
#include <stdlib.h>
19
#include <stdio.h>
20
#include <assert.h>
21
#include <string.h>
22
#include <fnmatch.h>
23
24
#ifndef FALSE
25
#define FALSE (0)
26
#endif
27
28
#ifndef TRUE
29
#define TRUE  (!FALSE)
30
#endif
31
32
typedef struct XdgAlias XdgAlias;
33
34
struct XdgAlias 
35
{
36
  char *alias;
37
  char *mime_type;
38
};
39
40
struct XdgAliasList
41
{
42
  struct XdgAlias *aliases;
43
  int n_aliases;
44
};
45
46
XdgAliasList *
47
_xdg_mime_alias_list_new (void)
48
0
{
49
0
  XdgAliasList *list;
50
51
0
  list = malloc (sizeof (XdgAliasList));
52
53
0
  list->aliases = NULL;
54
0
  list->n_aliases = 0;
55
56
0
  return list;
57
0
}
58
59
void         
60
_xdg_mime_alias_list_free (XdgAliasList *list)
61
0
{
62
0
  int i;
63
64
0
  if (list->aliases)
65
0
    {
66
0
      for (i = 0; i < list->n_aliases; i++)
67
0
  {
68
0
    free (list->aliases[i].alias);
69
0
    free (list->aliases[i].mime_type);
70
0
  }
71
0
      free (list->aliases);
72
0
    }
73
0
  free (list);
74
0
}
75
76
static int
77
alias_entry_cmp (const void *v1, const void *v2)
78
0
{
79
0
  return strcmp (((XdgAlias *)v1)->alias, ((XdgAlias *)v2)->alias);
80
0
}
81
82
const char  *
83
_xdg_mime_alias_list_lookup (XdgAliasList *list,
84
           const char   *alias)
85
0
{
86
0
  XdgAlias *entry;
87
0
  XdgAlias key;
88
89
0
  if (list->n_aliases > 0)
90
0
    {
91
0
      key.alias = (char *)alias;
92
0
      key.mime_type = NULL;
93
94
0
      entry = bsearch (&key, list->aliases, list->n_aliases,
95
0
           sizeof (XdgAlias), alias_entry_cmp);
96
0
      if (entry)
97
0
        return entry->mime_type;
98
0
    }
99
100
0
  return NULL;
101
0
}
102
103
void
104
_xdg_mime_alias_read_from_file (XdgAliasList *list,
105
        const char   *file_name)
106
0
{
107
0
  FILE *file;
108
0
  char line[255];
109
0
  int alloc;
110
111
0
  file = fopen (file_name, "r");
112
113
0
  if (file == NULL)
114
0
    return;
115
116
  /* FIXME: Not UTF-8 safe.  Doesn't work if lines are greater than 255 chars.
117
   * Blah */
118
0
  alloc = list->n_aliases + 16;
119
0
  list->aliases = realloc (list->aliases, alloc * sizeof (XdgAlias));
120
0
  while (fgets (line, 255, file) != NULL)
121
0
    {
122
0
      char *sep;
123
0
      if (line[0] == '#')
124
0
  continue;
125
126
0
      sep = strchr (line, ' ');
127
0
      if (sep == NULL)
128
0
  continue;
129
0
      *(sep++) = '\000';
130
0
      sep[strlen (sep) -1] = '\000';
131
0
      if (list->n_aliases == alloc)
132
0
  {
133
0
    alloc <<= 1;
134
0
    list->aliases = realloc (list->aliases, 
135
0
           alloc * sizeof (XdgAlias));
136
0
  }
137
0
      list->aliases[list->n_aliases].alias = strdup (line);
138
0
      list->aliases[list->n_aliases].mime_type = strdup (sep);
139
0
      list->n_aliases++;
140
0
    }
141
0
  list->aliases = realloc (list->aliases, 
142
0
         list->n_aliases * sizeof (XdgAlias));
143
144
0
  fclose (file);  
145
  
146
0
  if (list->n_aliases > 1)
147
0
    qsort (list->aliases, list->n_aliases, 
148
0
           sizeof (XdgAlias), alias_entry_cmp);
149
0
}
150
151
152
void
153
_xdg_mime_alias_list_dump (XdgAliasList *list)
154
0
{
155
0
  int i;
156
157
0
  if (list->aliases)
158
0
    {
159
0
      for (i = 0; i < list->n_aliases; i++)
160
0
  {
161
0
    printf ("%s %s\n", 
162
0
      list->aliases[i].alias,
163
0
      list->aliases[i].mime_type);
164
0
  }
165
0
    }
166
0
}
167
168