view patches/pango-1.36.8-substitute-env.patch @ 6433:a3a0085299f5

Update pango to 1.36.8
author Masamichi Hosoda <trueroad@trueroad.jp>
date Sat, 29 Aug 2015 15:44:07 +0900
parents
children
line wrap: on
line source

--- pango-1.36.8/pango/pango-utils.c.orig	2014-08-31 02:02:57.000000000 +0900
+++ pango-1.36.8/pango/pango-utils.c	2015-08-30 21:31:27.361804200 +0900
@@ -43,6 +43,7 @@
 #include <stdlib.h>
 #include <math.h>
 #include <locale.h>
+#include <ctype.h>
 
 #include "pango-font.h"
 #include "pango-features.h"
@@ -177,6 +178,89 @@
   return g_strndup (str, len);
 }
 
+
+/** 
+  g_string_substitute_environment()
+  @orig: a string
+
+  Replaces environment variables of the form ${FOO} or $FOO.
+
+  Return value: A newly-allocated string, that must be freed with
+  g_string_free()
+ */
+GString *
+g_string_substitute_environment (GString *orig)
+{
+  GString * out = g_string_new ("");
+  char *ptr = NULL;
+  
+  ptr = orig->str;
+  while (ptr  < orig->str + orig->len)
+    {
+      char *dollar = strchr (ptr, '$');
+      
+      if (dollar != NULL)
+	{
+	  char *start_var = dollar + 1;
+	  char *end_var = start_var;
+	  char *start_next = end_var;
+	  
+	  g_string_append_len (out, ptr, dollar - ptr);
+	  ptr = dollar;
+
+	  if (*start_var == '{')
+	    {
+	      start_var ++;
+	      
+	      end_var = strchr (start_var, '}');
+	      
+	      if (end_var == NULL)
+		{
+		  end_var = orig->str + orig->len;
+		  start_next = end_var;
+		}
+	      else
+		{
+		  start_next = end_var + 1; 
+		}
+	    }
+	  else 
+	    {
+	      /*
+		Hmm. what to do for $1 , $~ etc.?
+	       */
+	      do
+		{
+		  end_var ++;
+		}
+	      while (isalnum (*end_var) || *end_var == '_');
+	      start_next = end_var;
+	    }
+
+	  if (start_var < end_var)
+	    {
+	      GString *var_name = g_string_new_len (start_var, end_var - start_var);
+	      const char *value = g_getenv (var_name->str);
+	      if (value != NULL)
+		g_string_append (out, value);
+	      g_string_free (var_name, TRUE);
+
+
+	      ptr = start_next;
+	    }
+	}
+      else
+	break;
+
+    }
+
+  g_string_append (out, ptr);
+
+  return out;
+}
+
+
+
 /**
  * pango_split_file_list:
  * @str: a %G_SEARCHPATH_SEPARATOR separated list of filenames
@@ -232,6 +316,16 @@
 	  file = g_strdup (g_get_home_dir());
 	}
 #endif
+
+      {
+	GString *file_as_gs = g_string_new (file);
+	GString *substituted = g_string_substitute_environment (file_as_gs);
+	g_free (file);
+	file = substituted->str;
+	g_string_free (substituted, FALSE);
+	g_string_free (file_as_gs, TRUE);
+      }
+      
       g_free (files[i]);
       files[i] = file;
 
@@ -414,6 +508,7 @@
   return TRUE;
 }
 
+
 /**
  * pango_scan_string:
  * @pos: (inout): in/out string position
@@ -499,6 +594,13 @@
 	}
     }
 
+
+  {
+    GString *subbed = g_string_substitute_environment (out);
+    g_string_assign (out, subbed->str);
+    g_string_free (subbed, TRUE);
+  }
+  
   *pos = p;
 
   return TRUE;