~ubuntu-branches/debian/experimental/gupnp/experimental

« back to all changes in this revision

Viewing changes to libgupnp/xdgmime/xdgmimealias.c

  • Committer: Bazaar Package Importer
  • Author(s): Ross Burton
  • Date: 2008-06-30 09:32:18 UTC
  • mfrom: (1.2.1 upstream) (2.1.5 intrepid)
  • Revision ID: james.westby@ubuntu.com-20080630093218-vmb4elru8cn18579
Tags: 0.12.1-1
New upstream release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
 
 * Licensed under the Academic Free License version 2.0
10
 
 * Or under the following terms:
11
 
 *
12
 
 * This library is free software; you can redistribute it and/or
13
 
 * modify it under the terms of the GNU Lesser General Public
14
 
 * License as published by the Free Software Foundation; either
15
 
 * version 2 of the License, or (at your option) any later version.
16
 
 *
17
 
 * This library is distributed in the hope that it will be useful,
18
 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19
 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
 
 * Lesser General Public License for more details.
21
 
 *
22
 
 * You should have received a copy of the GNU Lesser General Public
23
 
 * License along with this library; if not, write to the
24
 
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
25
 
 * Boston, MA 02111-1307, USA.
26
 
 */
27
 
 
28
 
#ifdef HAVE_CONFIG_H
29
 
#include <config.h>
30
 
#endif
31
 
 
32
 
#include "xdgmimealias.h"
33
 
#include "xdgmimeint.h"
34
 
#include <stdlib.h>
35
 
#include <stdio.h>
36
 
#include <assert.h>
37
 
#include <string.h>
38
 
#include <fnmatch.h>
39
 
 
40
 
#ifndef FALSE
41
 
#define FALSE   (0)
42
 
#endif
43
 
 
44
 
#ifndef TRUE
45
 
#define TRUE    (!FALSE)
46
 
#endif
47
 
 
48
 
typedef struct XdgAlias XdgAlias;
49
 
 
50
 
struct XdgAlias 
51
 
{
52
 
  char *alias;
53
 
  char *mime_type;
54
 
};
55
 
 
56
 
struct XdgAliasList
57
 
{
58
 
  struct XdgAlias *aliases;
59
 
  int n_aliases;
60
 
};
61
 
 
62
 
XdgAliasList *
63
 
_xdg_mime_alias_list_new (void)
64
 
{
65
 
  XdgAliasList *list;
66
 
 
67
 
  list = malloc (sizeof (XdgAliasList));
68
 
 
69
 
  list->aliases = NULL;
70
 
  list->n_aliases = 0;
71
 
 
72
 
  return list;
73
 
}
74
 
 
75
 
void         
76
 
_xdg_mime_alias_list_free (XdgAliasList *list)
77
 
{
78
 
  int i;
79
 
 
80
 
  if (list->aliases)
81
 
    {
82
 
      for (i = 0; i < list->n_aliases; i++)
83
 
        {
84
 
          free (list->aliases[i].alias);
85
 
          free (list->aliases[i].mime_type);
86
 
        }
87
 
      free (list->aliases);
88
 
    }
89
 
  free (list);
90
 
}
91
 
 
92
 
static int
93
 
alias_entry_cmp (const void *v1, const void *v2)
94
 
{
95
 
  return strcmp (((XdgAlias *)v1)->alias, ((XdgAlias *)v2)->alias);
96
 
}
97
 
 
98
 
const char  *
99
 
_xdg_mime_alias_list_lookup (XdgAliasList *list,
100
 
                             const char   *alias)
101
 
{
102
 
  XdgAlias *entry;
103
 
  XdgAlias key;
104
 
 
105
 
  if (list->n_aliases > 0)
106
 
    {
107
 
      key.alias = (char *)alias;
108
 
      key.mime_type = NULL;
109
 
 
110
 
      entry = bsearch (&key, list->aliases, list->n_aliases,
111
 
                       sizeof (XdgAlias), alias_entry_cmp);
112
 
      if (entry)
113
 
        return entry->mime_type;
114
 
    }
115
 
 
116
 
  return NULL;
117
 
}
118
 
 
119
 
void
120
 
_xdg_mime_alias_read_from_file (XdgAliasList *list,
121
 
                                const char   *file_name)
122
 
{
123
 
  FILE *file;
124
 
  char line[255];
125
 
  int alloc;
126
 
 
127
 
  file = fopen (file_name, "r");
128
 
 
129
 
  if (file == NULL)
130
 
    return;
131
 
 
132
 
  /* FIXME: Not UTF-8 safe.  Doesn't work if lines are greater than 255 chars.
133
 
   * Blah */
134
 
  alloc = list->n_aliases + 16;
135
 
  list->aliases = realloc (list->aliases, alloc * sizeof (XdgAlias));
136
 
  while (fgets (line, 255, file) != NULL)
137
 
    {
138
 
      char *sep;
139
 
      if (line[0] == '#')
140
 
        continue;
141
 
 
142
 
      sep = strchr (line, ' ');
143
 
      if (sep == NULL)
144
 
        continue;
145
 
      *(sep++) = '\000';
146
 
      sep[strlen (sep) -1] = '\000';
147
 
      if (list->n_aliases == alloc)
148
 
        {
149
 
          alloc <<= 1;
150
 
          list->aliases = realloc (list->aliases, 
151
 
                                   alloc * sizeof (XdgAlias));
152
 
        }
153
 
      list->aliases[list->n_aliases].alias = strdup (line);
154
 
      list->aliases[list->n_aliases].mime_type = strdup (sep);
155
 
      list->n_aliases++;
156
 
    }
157
 
  list->aliases = realloc (list->aliases, 
158
 
                           list->n_aliases * sizeof (XdgAlias));
159
 
 
160
 
  fclose (file);  
161
 
  
162
 
  if (list->n_aliases > 1)
163
 
    qsort (list->aliases, list->n_aliases, 
164
 
           sizeof (XdgAlias), alias_entry_cmp);
165
 
}
166
 
 
167
 
 
168
 
void
169
 
_xdg_mime_alias_list_dump (XdgAliasList *list)
170
 
{
171
 
  int i;
172
 
 
173
 
  if (list->aliases)
174
 
    {
175
 
      for (i = 0; i < list->n_aliases; i++)
176
 
        {
177
 
          printf ("%s %s\n", 
178
 
                  list->aliases[i].alias,
179
 
                  list->aliases[i].mime_type);
180
 
        }
181
 
    }
182
 
}
183
 
 
184