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 48typedef struct XdgAlias XdgAlias; 49 50struct XdgAlias 51{ 52 char *alias; 53 char *mime_type; 54}; 55 56struct XdgAliasList 57{ 58 struct XdgAlias *aliases; 59 int n_aliases; 60}; 61 62XdgAliasList * 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 75void 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 92static int 93alias_entry_cmp (const void *v1, const void *v2) 94{ 95 return strcmp (((XdgAlias *)v1)->alias, ((XdgAlias *)v2)->alias); 96} 97 98const 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 119void 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 168void 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