Read the new glob2 format with case sensitive flags
authorAlexander Larsson <alexl@redhat.com>
Fri, 2 Oct 2009 07:46:33 +0000 (09:46 +0200)
committerAlexander Larsson <alexl@redhat.com>
Fri, 2 Oct 2009 10:55:54 +0000 (12:55 +0200)
gio/xdgmime/xdgmime.c
gio/xdgmime/xdgmimeglob.c
gio/xdgmime/xdgmimeglob.h

index c9bcfba66404ad19dbc556e5bfc814cad80fd0c5..0888583d2bebc33771a9b3798404a6cf748917a0 100644 (file)
@@ -165,7 +165,7 @@ xdg_mime_init_from_directory (const char *directory)
   strcpy (file_name, directory); strcat (file_name, "/mime/globs2");
   if (stat (file_name, &st) == 0)
     {
-      _xdg_mime_glob_read_from_file (global_hash, file_name);
+      _xdg_mime_glob_read_from_file (global_hash, file_name, TRUE);
       xdg_dir_time_list_add (file_name, st.st_mtime);
     }
   else
@@ -175,7 +175,7 @@ xdg_mime_init_from_directory (const char *directory)
       strcpy (file_name, directory); strcat (file_name, "/mime/globs");
       if (stat (file_name, &st) == 0)
         {
-          _xdg_mime_glob_read_from_file (global_hash, file_name);
+          _xdg_mime_glob_read_from_file (global_hash, file_name, FALSE);
           xdg_dir_time_list_add (file_name, st.st_mtime);
         }
       else
index d7c79b17f9bbe5bfbecd9a386113f78607cf3038..392eaabeec27a4617c32c5cd9d44e93445fe43bc 100644 (file)
@@ -493,7 +493,8 @@ void
 _xdg_glob_hash_append_glob (XdgGlobHash *glob_hash,
                            const char  *glob,
                            const char  *mime_type,
-                           int          weight)
+                           int          weight,
+                           int          case_sensitive)
 {
   XdgGlobType type;
 
@@ -555,10 +556,12 @@ _xdg_glob_hash_dump (XdgGlobHash *glob_hash)
 
 void
 _xdg_mime_glob_read_from_file (XdgGlobHash *glob_hash,
-                              const char  *file_name)
+                              const char  *file_name,
+                              int          version_two)
 {
   FILE *glob_file;
   char line[255];
+  char *p;
 
   glob_file = fopen (file_name, "r");
 
@@ -569,33 +572,67 @@ _xdg_mime_glob_read_from_file (XdgGlobHash *glob_hash,
    * Blah */
   while (fgets (line, 255, glob_file) != NULL)
     {
-      char *colon, *colon2;
-      char *mimetype, *glob;
+      char *colon;
+      char *mimetype, *glob, *end;
       int weight;
+      int case_sensitive;
 
-      if (line[0] == '#')
+      if (line[0] == '#' || line[0] == 0)
        continue;
 
-      colon = strchr (line, ':');
+      end = line + strlen(line) - 1;
+      if (*end == '\n')
+       *end = 0;
+
+      p = line;
+      if (version_two)
+       {
+         colon = strchr (p, ':');
+         if (colon == NULL)
+           continue;
+         *colon = 0;
+          weight = atoi (p);
+         p = colon + 1;
+       }
+      else
+       weight = 50;
+
+      colon = strchr (p, ':');
       if (colon == NULL)
        continue;
-      *(colon++) = '\0';
-      colon[strlen (colon) -1] = '\0';
-      colon2 = strchr (colon, ':');
-      if (colon2) 
-        {
-          *(colon2++) = '\000';
-          weight = atoi (line);
-          mimetype = colon;
-          glob = colon2;
-        }
-      else 
-        {
-          weight = 50;
-          mimetype = line;
-          glob = colon;
-        }
-      _xdg_glob_hash_append_glob (glob_hash, glob, mimetype, weight);
+      *colon = 0;
+
+      mimetype = p;
+      p = colon + 1;
+      glob = p;
+      case_sensitive = FALSE;
+
+      colon = strchr (p, ':');
+      if (version_two && colon != NULL)
+       {
+         char *flag;
+
+         /* We got flags */
+         *colon = 0;
+         p = colon + 1;
+
+         /* Flags end at next colon */
+         colon = strchr (p, ':');
+         if (colon != NULL)
+           *colon = 0;
+
+         flag = strstr (p, "cs");
+         if (flag != NULL &&
+             /* Start or after comma */
+             (flag == p ||
+              flag[-1] == ',') &&
+             /* ends with comma or end of string */
+             (flag[2] == 0 ||
+              flag[2] == ','))
+           case_sensitive = TRUE;
+       }
+
+      _xdg_glob_hash_append_glob (glob_hash, glob, mimetype, weight, case_sensitive);
     }
 
   fclose (glob_file);
index df8dc79f28cd98f576de2609022373d1a6fa96d4..00182920d44250b837a118d20fdd2471692f92c8 100644 (file)
@@ -51,7 +51,8 @@ typedef enum
 #endif
 
 void         _xdg_mime_glob_read_from_file   (XdgGlobHash *glob_hash,
-                                             const char  *file_name);
+                                             const char  *file_name,
+                                             int          version_two);
 XdgGlobHash *_xdg_glob_hash_new              (void);
 void         _xdg_glob_hash_free             (XdgGlobHash *glob_hash);
 int          _xdg_glob_hash_lookup_file_name (XdgGlobHash *glob_hash,
@@ -61,7 +62,8 @@ int          _xdg_glob_hash_lookup_file_name (XdgGlobHash *glob_hash,
 void         _xdg_glob_hash_append_glob      (XdgGlobHash *glob_hash,
                                              const char  *glob,
                                              const char  *mime_type,
-                                             int          weight);
+                                             int          weight,
+                                             int          case_sensitive);
 XdgGlobType  _xdg_glob_determine_type        (const char  *glob);
 void         _xdg_glob_hash_dump             (XdgGlobHash *glob_hash);