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