use expand instead of expand_template for useragent.
authorBrendan Taylor <whateley@gmail.com>
Tue, 7 Jul 2009 10:50:15 +0000 (04:50 -0600)
committerBrendan Taylor <whateley@gmail.com>
Tue, 7 Jul 2009 11:28:06 +0000 (05:28 -0600)
examples/config/uzbl/config
tests/test-expand.c
uzbl.c
uzbl.h

index a4a5f45..c431822 100644 (file)
@@ -85,9 +85,9 @@ set always_insert_mode = 0
 #set  proxy_url       = http://127.0.0.1:8118
 #values 0-3
 #set  http_debug      = 0
-#set  useragent       = uzbl (Webkit WEBKIT_MAJOR.WEBKIT_MINOR.WEBKIT_MICRO)
+#set  useragent       = uzbl (Webkit @WEBKIT_MAJOR.@WEBKIT_MINOR.@WEBKIT_MICRO)
 # Example user agent containing everything:
-set  useragent       = Uzbl (Webkit WEBKIT_MAJOR.WEBKIT_MINOR.WEBKIT_MICRO) (SYSNAME NODENAME KERNREL KERNVER ARCH_SYSTEM [ARCH_UZBL]) (Commit COMMIT)
+set  useragent       = Uzbl (Webkit @WEBKIT_MAJOR.@WEBKIT_MINOR.@WEBKIT_MICRO) (@SYSNAME @NODENAME @KERNREL @KERNVER @ARCH_SYSTEM [@ARCH_UZBL]) (Commit @COMMIT)
 #set  max_conns              = 0
 #set  max_conns_host  = 0
 
index d9fb6e9..c0eae41 100644 (file)
@@ -27,6 +27,7 @@
 
 extern Uzbl uzbl;
 
+extern gchar* expand(char*, guint);
 extern gchar* expand_template(const char*, gboolean);
 extern void make_var_to_name_hash(void);
 
@@ -106,16 +107,13 @@ test_WEBKIT_VERSION (void) {
     g_string_append(expected, " ");
     g_string_append(expected, itos(WEBKIT_MICRO_VERSION));
 
-    g_assert_cmpstr(expand_template("WEBKIT_MAJOR WEBKIT_MINOR WEBKIT_MICRO", FALSE), ==, g_string_free(expected, FALSE));
+    g_assert_cmpstr(expand("@WEBKIT_MAJOR @WEBKIT_MINOR @WEBKIT_MICRO", 0), ==, g_string_free(expected, FALSE));
 }
 
 void
 test_UNAMEINFO (void) {
     GString* expected = g_string_new("");
 
-    if(uname(&uzbl.state.unameinfo) == -1)
-      g_printerr("Can't retrieve unameinfo. This test might fail.\n");
-
     g_string_append(expected, uzbl.state.unameinfo.sysname);
     g_string_append(expected, " ");
     g_string_append(expected, uzbl.state.unameinfo.nodename);
@@ -126,17 +124,17 @@ test_UNAMEINFO (void) {
     g_string_append(expected, " ");
     g_string_append(expected, uzbl.state.unameinfo.machine);
 
-    g_assert_cmpstr(expand_template("SYSNAME NODENAME KERNREL KERNVER ARCH_SYSTEM", FALSE), ==, g_string_free(expected, FALSE));
+    g_assert_cmpstr(expand("@SYSNAME @NODENAME @KERNREL @KERNVER @ARCH_SYSTEM", 0), ==, g_string_free(expected, FALSE));
 }
 
 void
 test_ARCH_UZBL (void) {
-    g_assert_cmpstr(expand_template("ARCH_UZBL", FALSE), ==, ARCH);
+    g_assert_cmpstr(expand("@ARCH_UZBL", 0), ==, ARCH);
 }
 
 void
 test_COMMIT (void) {
-    g_assert_cmpstr(expand_template("COMMIT", FALSE), ==, COMMIT);
+    g_assert_cmpstr(expand("@COMMIT", 0), ==, COMMIT);
 }
 
 void
@@ -149,7 +147,7 @@ test_cmd_useragent_simple (void) {
     g_string_append(expected, itos(WEBKIT_MICRO_VERSION));
     g_string_append(expected, ")");
 
-    set_var_value("useragent", "Uzbl (Webkit WEBKIT_MAJOR.WEBKIT_MINOR.WEBKIT_MICRO)");
+    set_var_value("useragent", "Uzbl (Webkit @WEBKIT_MAJOR.@WEBKIT_MINOR.@WEBKIT_MICRO)");
     g_assert_cmpstr(uzbl.net.useragent, ==, g_string_free(expected, FALSE));
 }
 
@@ -178,7 +176,7 @@ test_cmd_useragent_full (void) {
     g_string_append(expected, COMMIT);
     g_string_append(expected, ")");
 
-    set_var_value("useragent", "Uzbl (Webkit WEBKIT_MAJOR.WEBKIT_MINOR.WEBKIT_MICRO) (SYSNAME NODENAME KERNREL KERNVER ARCH_SYSTEM [ARCH_UZBL]) (Commit COMMIT)");
+    set_var_value("useragent", "Uzbl (Webkit @WEBKIT_MAJOR.@WEBKIT_MINOR.@WEBKIT_MICRO) (@SYSNAME @NODENAME @KERNREL @KERNVER @ARCH_SYSTEM [@ARCH_UZBL]) (Commit @COMMIT)");
     g_assert_cmpstr(uzbl.net.useragent, ==, g_string_free(expected, FALSE));
 }
 
@@ -210,6 +208,10 @@ main (int argc, char *argv[]) {
         g_thread_init (NULL);
 
     uzbl.net.soup_session = webkit_get_default_session();
+
+    if(uname(&uzbl.state.unameinfo) == -1)
+      g_printerr("Can't retrieve unameinfo. This test might fail.\n");
+
     setup_scanner();
     make_var_to_name_hash();
 
diff --git a/uzbl.c b/uzbl.c
index 1d2a6c9..3c89bb2 100644 (file)
--- a/uzbl.c
+++ b/uzbl.c
@@ -157,6 +157,30 @@ const struct {
 }, *n2v_p = var_name_to_ptr;
 
 const struct {
+    char *name;
+    struct {
+      void *ptr;
+      int type;
+    } cp;
+} const_name_to_ptr[] = {
+    { "WEBKIT_MAJOR",  {(void*)WEBKIT_MAJOR_VERSION,        TYPE_INT}},
+    { "WEBKIT_MINOR",  {(void*)WEBKIT_MINOR_VERSION,        TYPE_INT}},
+    { "WEBKIT_MICRO",  {(void*)WEBKIT_MICRO_VERSION,        TYPE_INT}},
+    { "SYSNAME",       {&(uzbl.state.unameinfo.sysname),    TYPE_STR}},
+    { "NODENAME",      {&(uzbl.state.unameinfo.nodename),   TYPE_STR}},
+    { "KERNREL",       {&(uzbl.state.unameinfo.release),    TYPE_STR}},
+    { "KERNVER",       {&(uzbl.state.unameinfo.version),    TYPE_STR}},
+    { "ARCH_SYSTEM",   {&(uzbl.state.unameinfo.machine),    TYPE_STR}},
+    { "ARCH_UZBL",     {&(ARCH),                            TYPE_STR}},
+#ifdef _GNU_SOURCE
+    { "DOMAINNAME",    {&(uzbl.state.unameinfo.domainname), TYPE_STR}},
+#endif
+    { "COMMIT",        {&(COMMIT),                          TYPE_STR}},
+
+    { NULL,            {NULL,                               TYPE_INT}}
+}, *n2c_p = const_name_to_ptr;
+
+const struct {
     char *key;
     guint mask;
 } modkeys[] = {
@@ -180,7 +204,8 @@ const struct {
 };
 
 
-/* construct a hash from the var_name_to_ptr array for quick access */
+/* construct a hash from the var_name_to_ptr and the const_name_to_ptr array
+ * for quick access */
 void
 make_var_to_name_hash() {
     uzbl.comm.proto_var = g_hash_table_new(g_str_hash, g_str_equal);
@@ -188,6 +213,12 @@ make_var_to_name_hash() {
         g_hash_table_insert(uzbl.comm.proto_var, n2v_p->name, (gpointer) &n2v_p->cp);
         n2v_p++;
     }
+
+    uzbl.comm.proto_const = g_hash_table_new(g_str_hash, g_str_equal);
+    while(n2c_p->name) {
+        g_hash_table_insert(uzbl.comm.proto_const, n2c_p->name, (gpointer) &n2c_p->cp);
+        n2c_p++;
+    }
 }
 
 /* --- UTILITY FUNCTIONS --- */
@@ -212,7 +243,7 @@ return EXP_ERR;
  * recurse == 1: don't expand '@(command)@'
  * recurse == 2: don't expand '@<java script>@'
  */
-static gchar *
+gchar *
 expand(char *s, guint recurse) {
     uzbl_cmdprop *c;
     guint etype;
@@ -276,17 +307,25 @@ expand(char *s, guint recurse) {
                         break;
                 }
 
-                if(etype == EXP_SIMPLE_VAR || 
+                if(etype == EXP_SIMPLE_VAR ||
                    etype == EXP_BRACED_VAR) {
-                    if( (c = g_hash_table_lookup(uzbl.comm.proto_var, ret)) ) {
-                        if(c->type == TYPE_STR)
-                            g_string_append(buf, (gchar *)*c->ptr);
-                        else if(c->type == TYPE_INT) {
-                            char *b = itos((int)*c->ptr);
-                            g_string_append(buf, b);
-                            g_free(b);
-                        }
+                    void *ptr;
+
+                    if('A' <= ret[0] && 'Z' >= ret[0] &&
+                       (c = g_hash_table_lookup(uzbl.comm.proto_const, ret))) {
+                        ptr = c->ptr;
+                    } else if( (c = g_hash_table_lookup(uzbl.comm.proto_var, ret)) ) {
+                        ptr = *c->ptr;
+                    }
+
+                    if(c && c->type == TYPE_STR) {
+                        g_string_append(buf, (gchar *)ptr);
+                    } else if(c && c->type == TYPE_INT) {
+                        char *b = itos((uintptr_t)ptr);
+                        g_string_append(buf, b);
+                        g_free(b);
                     }
+
                     if(etype == EXP_SIMPLE_VAR)
                         s = vend;
                     else
@@ -1278,47 +1317,6 @@ expand_template(const char *template, gboolean escape_markup) {
                              uzbl.gui.sbar.msg?uzbl.gui.sbar.msg:"");
                      break;
                      /* useragent syms */
-                 case SYM_WK_MAJ:
-                     buf = itos(WEBKIT_MAJOR_VERSION);
-                     g_string_append(ret, buf);
-                     g_free(buf);
-                     break;
-                 case SYM_WK_MIN:
-                     buf = itos(WEBKIT_MINOR_VERSION);
-                     g_string_append(ret, buf);
-                     g_free(buf);
-                     break;
-                 case SYM_WK_MIC:
-                     buf = itos(WEBKIT_MICRO_VERSION);
-                     g_string_append(ret, buf);
-                     g_free(buf);
-                     break;
-                 case SYM_SYSNAME:
-                     g_string_append(ret, uzbl.state.unameinfo.sysname);
-                     break;
-                 case SYM_NODENAME:
-                     g_string_append(ret, uzbl.state.unameinfo.nodename);
-                     break;
-                 case SYM_KERNREL:
-                     g_string_append(ret, uzbl.state.unameinfo.release);
-                     break;
-                 case SYM_KERNVER:
-                     g_string_append(ret, uzbl.state.unameinfo.version);
-                     break;
-                 case SYM_ARCHSYS:
-                     g_string_append(ret, uzbl.state.unameinfo.machine);
-                     break;
-                 case SYM_ARCHUZBL:
-                     g_string_append(ret, ARCH);
-                     break;
-#ifdef _GNU_SOURCE
-                 case SYM_DOMAINNAME:
-                     g_string_append(ret, uzbl.state.unameinfo.domainname);
-                     break;
-#endif
-                 case SYM_COMMIT:
-                     g_string_append(ret, COMMIT);
-                     break;
                  default:
                      break;
              }
@@ -1764,11 +1762,8 @@ cmd_useragent() {
         g_free (uzbl.net.useragent);
         uzbl.net.useragent = NULL;
     } else {
-        gchar *ua = expand_template(uzbl.net.useragent, FALSE);
-        if (ua)
-            g_object_set(G_OBJECT(uzbl.net.soup_session), SOUP_SESSION_USER_AGENT, ua, NULL);
-        g_free(uzbl.net.useragent);
-        uzbl.net.useragent = ua;
+        g_object_set(G_OBJECT(uzbl.net.soup_session), SOUP_SESSION_USER_AGENT,
+            uzbl.net.useragent, NULL);
     }
 }
 
diff --git a/uzbl.h b/uzbl.h
index daed44f..e9134fc 100644 (file)
--- a/uzbl.h
+++ b/uzbl.h
@@ -17,12 +17,6 @@ enum {
   SYM_LOADPRGS, SYM_LOADPRGSBAR,
   SYM_KEYCMD, SYM_MODE, SYM_MSG,
   SYM_SELECTED_URI,
-  /* useragent symbols */
-  SYM_WK_MAJ, SYM_WK_MIN, SYM_WK_MIC,
-  SYM_SYSNAME, SYM_NODENAME,
-  SYM_KERNREL, SYM_KERNVER,
-  SYM_ARCHSYS, SYM_ARCHUZBL,
-  SYM_DOMAINNAME, SYM_COMMIT
 };
 
 const struct {
@@ -39,17 +33,6 @@ const struct {
     {"LOAD_PROGRESS",        SYM_LOADPRGS},
     {"LOAD_PROGRESSBAR",     SYM_LOADPRGSBAR},
 
-    {"WEBKIT_MAJOR",         SYM_WK_MAJ},
-    {"WEBKIT_MINOR",         SYM_WK_MIN},
-    {"WEBKIT_MICRO",         SYM_WK_MIC},
-    {"SYSNAME",              SYM_SYSNAME},
-    {"NODENAME",             SYM_NODENAME},
-    {"KERNREL",              SYM_KERNREL},
-    {"KERNVER",              SYM_KERNVER},
-    {"ARCH_SYSTEM",          SYM_ARCHSYS},
-    {"ARCH_UZBL",            SYM_ARCHUZBL},
-    {"DOMAINNAME",           SYM_DOMAINNAME},
-    {"COMMIT",               SYM_COMMIT},
     {NULL,                   0}
 }, *symp = symbols;
 
@@ -93,6 +76,9 @@ typedef struct {
     gchar          *socket_path;
     /* stores (key)"variable name" -> (value)"pointer to this var*/
     GHashTable     *proto_var;
+    /* stores (key)"CONSTANT NAME" -> (value)"pointer to this var*/
+    GHashTable     *proto_const;
+
     gchar          *sync_stdout;
 } Communication;