[vlc-devel] commit: xdg-dirs: falls back correctly if configuration is missing ( Rémi Denis-Courmont )

git version control git at videolan.org
Wed Sep 16 17:58:50 CEST 2009


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Wed Sep 16 18:58:30 2009 +0300| [4ab00885f95809f3065340a69d3f87fe4d9b56b0] | committer: Rémi Denis-Courmont 

xdg-dirs: falls back correctly if configuration is missing

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=4ab00885f95809f3065340a69d3f87fe4d9b56b0
---

 src/config/dirs_xdg.c |  128 +++++++++++++++++++++++++-----------------------
 1 files changed, 67 insertions(+), 61 deletions(-)

diff --git a/src/config/dirs_xdg.c b/src/config/dirs_xdg.c
index c1d4c45..6f6c004 100644
--- a/src/config/dirs_xdg.c
+++ b/src/config/dirs_xdg.c
@@ -121,78 +121,84 @@ static char *config_GetTypeDir (const char *xdg_name)
 
     FILE *stream = fopen (path, "rt");
     free (path);
-    if (stream == NULL)
-        return NULL;
-
-    char *linebuf = NULL;
-    size_t linelen = 0;
-
-    while (getline (&linebuf, &linelen, stream) != -1)
+    path = NULL;
+    if (stream != NULL)
     {
-        char *ptr = linebuf;
-        ptr += strspn (ptr, " \t"); /* Skip whites */
-        if (strncmp (ptr, "XDG_", 4))
-            continue;
-        ptr += 4; /* Skip XDG_ */
-        if (strncmp (ptr, xdg_name, namelen))
-            continue;
-        ptr += namelen; /* Skip XDG type name */
-        if (strncmp (ptr, "_DIR", 4))
-            continue;
-        ptr += 4; /* Skip _DIR */
-        ptr += strspn (ptr, " \t"); /* Skip whites */
-        if (*ptr != '=')
-            continue;
-        ptr++; /* Skip equality sign */
-        ptr += strspn (ptr, " \t"); /* Skip whites */
-        if (*ptr != '"')
-            continue;
-        ptr++; /* Skip quote */
-        linelen -= ptr - linebuf;
-
-        char *out;
-        if (strncmp (ptr, "$HOME", 5))
+        char *linebuf = NULL;
+        size_t linelen = 0;
+
+        while (getline (&linebuf, &linelen, stream) != -1)
         {
-            path = malloc (linelen);
-            if (path == NULL)
+            char *ptr = linebuf;
+            ptr += strspn (ptr, " \t"); /* Skip whites */
+            if (strncmp (ptr, "XDG_", 4))
                 continue;
-            out = path;
-        }
-        else
-        {   /* Prefix with $HOME */
-            ptr += 5;
-            path = malloc (homelen + linelen - 5);
-            if (path == NULL)
+            ptr += 4; /* Skip XDG_ */
+            if (strncmp (ptr, xdg_name, namelen))
                 continue;
-            memcpy (path, home, homelen);
-            out = path + homelen;
-        }
-
-        while (*ptr != '"')
-        {
-            if (*ptr == '\\')
-                ptr++;
-            if (*ptr == '\0')
-                goto skip;
-            *(out++) = *(ptr++);
+            ptr += namelen; /* Skip XDG type name */
+            if (strncmp (ptr, "_DIR", 4))
+                continue;
+            ptr += 4; /* Skip _DIR */
+            ptr += strspn (ptr, " \t"); /* Skip whites */
+            if (*ptr != '=')
+                continue;
+            ptr++; /* Skip equality sign */
+            ptr += strspn (ptr, " \t"); /* Skip whites */
+            if (*ptr != '"')
+                continue;
+            ptr++; /* Skip quote */
+            linelen -= ptr - linebuf;
+
+            char *out;
+            if (strncmp (ptr, "$HOME", 5))
+            {
+                path = malloc (linelen);
+                if (path == NULL)
+                    continue;
+                out = path;
+            }
+            else
+            {   /* Prefix with $HOME */
+                ptr += 5;
+                path = malloc (homelen + linelen - 5);
+                if (path == NULL)
+                    continue;
+                memcpy (path, home, homelen);
+                out = path + homelen;
+            }
+
+            while (*ptr != '"')
+            {
+                if (*ptr == '\\')
+                    ptr++;
+                if (*ptr == '\0')
+                {
+                    free (path);
+                    path = NULL;
+                    continue;
+                }
+                *(out++) = *(ptr++);
+            }
+            *out = '\0';
+            break;
         }
-        *out = '\0';
-        goto done;
-    skip:
-        free (path);
+        free (linebuf);
+        fclose (stream);
     }
 
     /* Default! */
-    if (strcmp (xdg_name, "DESKTOP") == 0)
+    if (path == NULL)
     {
-        if (asprintf (&path, "%s/Desktop", home) == -1)
-            path = NULL;
+        if (strcmp (xdg_name, "DESKTOP") == 0)
+        {
+            if (asprintf (&path, "%s/Desktop", home) == -1)
+                path = NULL;
+        }
+        else
+            path = strdup (home);
     }
-    else
-        path = strdup (home);
 
-done:
-    free (linebuf);
     char *ret = FromLocaleDup (path);
     free (path);
     return ret;




More information about the vlc-devel mailing list