(root)/
glib-2.79.0/
gio/
xdgmime/
xdgmimealias.c
       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  {
      49    XdgAliasList *list;
      50  
      51    list = malloc (sizeof (XdgAliasList));
      52  
      53    list->aliases = NULL;
      54    list->n_aliases = 0;
      55  
      56    return list;
      57  }
      58  
      59  void         
      60  _xdg_mime_alias_list_free (XdgAliasList *list)
      61  {
      62    int i;
      63  
      64    if (list->aliases)
      65      {
      66        for (i = 0; i < list->n_aliases; i++)
      67  	{
      68  	  free (list->aliases[i].alias);
      69  	  free (list->aliases[i].mime_type);
      70  	}
      71        free (list->aliases);
      72      }
      73    free (list);
      74  }
      75  
      76  static int
      77  alias_entry_cmp (const void *v1, const void *v2)
      78  {
      79    return strcmp (((XdgAlias *)v1)->alias, ((XdgAlias *)v2)->alias);
      80  }
      81  
      82  const char  *
      83  _xdg_mime_alias_list_lookup (XdgAliasList *list,
      84  			     const char   *alias)
      85  {
      86    XdgAlias *entry;
      87    XdgAlias key;
      88  
      89    if (list->n_aliases > 0)
      90      {
      91        key.alias = (char *)alias;
      92        key.mime_type = NULL;
      93  
      94        entry = bsearch (&key, list->aliases, list->n_aliases,
      95  		       sizeof (XdgAlias), alias_entry_cmp);
      96        if (entry)
      97          return entry->mime_type;
      98      }
      99  
     100    return NULL;
     101  }
     102  
     103  void
     104  _xdg_mime_alias_read_from_file (XdgAliasList *list,
     105  				const char   *file_name)
     106  {
     107    FILE *file;
     108    char line[255];
     109    int alloc;
     110  
     111    file = fopen (file_name, "r");
     112  
     113    if (file == NULL)
     114      return;
     115  
     116    /* FIXME: Not UTF-8 safe.  Doesn't work if lines are greater than 255 chars.
     117     * Blah */
     118    alloc = list->n_aliases + 16;
     119    list->aliases = realloc (list->aliases, alloc * sizeof (XdgAlias));
     120    while (fgets (line, 255, file) != NULL)
     121      {
     122        char *sep;
     123        if (line[0] == '#')
     124  	continue;
     125  
     126        sep = strchr (line, ' ');
     127        if (sep == NULL)
     128  	continue;
     129        *(sep++) = '\000';
     130        sep[strlen (sep) -1] = '\000';
     131        if (list->n_aliases == alloc)
     132  	{
     133  	  alloc <<= 1;
     134  	  list->aliases = realloc (list->aliases, 
     135  				   alloc * sizeof (XdgAlias));
     136  	}
     137        list->aliases[list->n_aliases].alias = strdup (line);
     138        list->aliases[list->n_aliases].mime_type = strdup (sep);
     139        list->n_aliases++;
     140      }
     141    list->aliases = realloc (list->aliases, 
     142  			   list->n_aliases * sizeof (XdgAlias));
     143  
     144    fclose (file);  
     145    
     146    if (list->n_aliases > 1)
     147      qsort (list->aliases, list->n_aliases, 
     148             sizeof (XdgAlias), alias_entry_cmp);
     149  }
     150  
     151  
     152  void
     153  _xdg_mime_alias_list_dump (XdgAliasList *list)
     154  {
     155    int i;
     156  
     157    if (list->aliases)
     158      {
     159        for (i = 0; i < list->n_aliases; i++)
     160  	{
     161  	  printf ("%s %s\n", 
     162  		  list->aliases[i].alias,
     163  		  list->aliases[i].mime_type);
     164  	}
     165      }
     166  }
     167  
     168