aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--examples/config/uzbl/config4
-rw-r--r--tests/test-expand.c20
-rw-r--r--uzbl.c109
-rw-r--r--uzbl.h20
4 files changed, 68 insertions, 85 deletions
diff --git a/examples/config/uzbl/config b/examples/config/uzbl/config
index a4a5f45..c431822 100644
--- a/examples/config/uzbl/config
+++ b/examples/config/uzbl/config
@@ -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
diff --git a/tests/test-expand.c b/tests/test-expand.c
index d9fb6e9..c0eae41 100644
--- a/tests/test-expand.c
+++ b/tests/test-expand.c
@@ -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
--- 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
--- 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;