diff options
author | Robert Manea <gotmor@gmail.com> | 2009-06-15 14:07:13 +0200 |
---|---|---|
committer | Robert Manea <gotmor@gmail.com> | 2009-06-15 14:07:13 +0200 |
commit | 0810d28f8326c454fc1a66ac6ac01d2a2e78d445 (patch) | |
tree | 3da9aad705a23f6dd3853d2c62b0787a899cc575 /uzbl.c | |
parent | 01cea9455cd42d58ff6e3a6f363449439cc89f2a (diff) |
added @() expressions to expand_vars - first draft, expect bugs
Diffstat (limited to 'uzbl.c')
-rw-r--r-- | uzbl.c | 56 |
1 files changed, 52 insertions, 4 deletions
@@ -191,12 +191,32 @@ make_var_to_name_hash() { } /* --- UTILITY FUNCTIONS --- */ + +enum {EXP_ERR, EXP_SIMPLE_VAR, EXP_BRACED_VAR, EXP_EXPR}; + +static guint +get_exp_type(gchar *s) { + /* variables */ + if(*(s+1) == '(') + return EXP_EXPR; + else if(*(s+1) == '{') + return EXP_BRACED_VAR; + else + return EXP_SIMPLE_VAR; + +return EXP_ERR; +} + static gchar * expand_vars(char *s) { uzbl_cmdprop *c; char upto = ' '; - char ret[256], *vend; + char ret[4096], *vend; GString *buf = g_string_new(""); + guint etype; + GError *err = NULL; + gchar *cmd_stdout = NULL; + gchar *mycmd = NULL; while(*s) { switch(*s) { @@ -205,14 +225,28 @@ expand_vars(char *s) { s++; break; case '@': - if(*(s+1) == '{') { - upto = '}'; s++; + etype = get_exp_type(s); + + switch(etype) { + case EXP_SIMPLE_VAR: + upto = ' '; + break; + case EXP_BRACED_VAR: + s++; upto = '}'; + break; + case EXP_EXPR: + s++; upto = ')'; + break; } s++; + if( (vend = strchr(s, upto)) || (vend = strchr(s, '\0')) ) { strncpy(ret, s, vend-s); ret[vend-s] = '\0'; + } + + 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); @@ -224,7 +258,21 @@ expand_vars(char *s) { } if(upto == ' ') s = vend; else s = vend+1; - upto = ' '; + } + else if(etype == EXP_EXPR) { + mycmd = expand_vars(ret); + g_spawn_command_line_sync(mycmd, &cmd_stdout, NULL, NULL, &err); + g_free(mycmd); + + if (err) { + g_printerr("error on running command: %s\n", err->message); + g_error_free (err); + } + else if (*cmd_stdout) { + g_string_append(buf, cmd_stdout); + g_free(cmd_stdout); + } + s = vend+1; } break; default: |