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 (at) 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 185