added a gsize -> int cast for gcc
[uzbl-mobile] / uzbl.c
diff --git a/uzbl.c b/uzbl.c
index dfd61a6..7b0d1db 100644 (file)
--- a/uzbl.c
+++ b/uzbl.c
@@ -31,7 +31,6 @@
 
 
 #define LENGTH(x) (sizeof x / sizeof x[0])
-#define MAX_BINDINGS 256
 #define _POSIX_SOURCE
 
 #include <gtk/gtk.h>
@@ -54,6 +53,7 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <signal.h>
+#include <assert.h>
 #include "uzbl.h"
 #include "config.h"
 
@@ -80,25 +80,25 @@ GOptionEntry entries[] =
     { NULL,      0, 0, 0, NULL, NULL, NULL }
 };
 
+enum ptr_type {TYPE_INT, TYPE_STR, TYPE_FLOAT};
+
 /* associate command names to their properties */
 typedef const struct {
     /* TODO: Make this ambiguous void **ptr into a union { char *char_p; int *int_p; float *float_p; } val;
              the PTR() macro is kind of preventing this change at the moment. */
     void **ptr;
-    int type;
+    enum ptr_type type;
     int dump;
     int writeable;
-    void (*func)(void);
+    /*@null@*/ void (*func)(void);
 } uzbl_cmdprop;
 
-enum {TYPE_INT, TYPE_STR, TYPE_FLOAT};
-
 /* abbreviations to help keep the table's width humane */
 #define PTR_V(var, t, d, fun) { .ptr = (void*)&(var), .type = TYPE_##t, .dump = d, .writeable = 1, .func = fun }
 #define PTR_C(var, t,    fun) { .ptr = (void*)&(var), .type = TYPE_##t, .dump = 0, .writeable = 0, .func = fun }
 
 const struct {
-    char *name;
+    const char *name;
     uzbl_cmdprop cp;
 } var_name_to_ptr[] = {
 /*    variable name         pointer to variable in code            type  dump callback function    */
@@ -119,8 +119,8 @@ const struct {
     { "status_pbar_pending", PTR_V(uzbl.gui.sbar.progress_u,        STR,  1,   update_title)},
     { "status_pbar_width",   PTR_V(uzbl.gui.sbar.progress_w,        INT,  1,   update_title)},
     { "status_background",   PTR_V(uzbl.behave.status_background,   STR,  1,   update_title)},
-    { "insert_indicator",    PTR_V(uzbl.behave.insert_indicator,    STR,  1,   update_title)},
-    { "command_indicator",   PTR_V(uzbl.behave.cmd_indicator,       STR,  1,   update_title)},
+    { "insert_indicator",    PTR_V(uzbl.behave.insert_indicator,    STR,  1,   update_indicator)},
+    { "command_indicator",   PTR_V(uzbl.behave.cmd_indicator,       STR,  1,   update_indicator)},
     { "title_format_long",   PTR_V(uzbl.behave.title_format_long,   STR,  1,   update_title)},
     { "title_format_short",  PTR_V(uzbl.behave.title_format_short,  STR,  1,   update_title)},
     { "icon",                PTR_V(uzbl.gui.icon,                   STR,  1,   set_icon)},
@@ -180,7 +180,7 @@ const struct {
 
 
 const struct {
-    char *key;
+    /*@null@*/ char *key;
     guint mask;
 } modkeys[] = {
     { "SHIFT",   GDK_SHIFT_MASK   }, // shift
@@ -216,7 +216,7 @@ make_var_to_name_hash() {
 /* --- UTILITY FUNCTIONS --- */
 enum {EXP_ERR, EXP_SIMPLE_VAR, EXP_BRACED_VAR, EXP_EXPR, EXP_JS, EXP_ESCAPE};
 guint
-get_exp_type(gchar *s) {
+get_exp_type(const gchar *s) {
     /* variables */
     if(*(s+1) == '(')
         return EXP_EXPR;
@@ -229,6 +229,7 @@ get_exp_type(gchar *s) {
     else
         return EXP_SIMPLE_VAR;
 
+    /*@notreached@*/
 return EXP_ERR;
 }
 
@@ -237,13 +238,11 @@ return EXP_ERR;
  * recurse == 2: don't expand '@<java script>@'
  */
 gchar *
-expand(char *s, guint recurse) {
+expand(const char *s, guint recurse) {
     uzbl_cmdprop *c;
     guint etype;
-    char upto = ' ';
     char *end_simple_var = "^°!\"§$%&/()=?'`'+~*'#-.:,;@<>| \\{}[]¹²³¼½";
-    char str_end[2];
-    char ret[4096];
+    char *ret = NULL;
     char *vend = NULL;
     GError *err = NULL;
     gchar *cmd_stdout = NULL;
@@ -268,37 +267,29 @@ expand(char *s, guint recurse) {
                         if(!vend) vend = strchr(s, '\0');
                         break;
                     case EXP_BRACED_VAR:
-                        s++; upto = '}';
-                        vend = strchr(s, upto);
+                        s++;
+                        vend = strchr(s, '}');
                         if(!vend) vend = strchr(s, '\0');
                         break;
                     case EXP_EXPR:
                         s++;
-                        strcpy(str_end, ")@");
-                        str_end[2] = '\0';
-                        vend = strstr(s, str_end);
+                        vend = strstr(s, ")@");
                         if(!vend) vend = strchr(s, '\0');
                         break;
                     case EXP_JS:
                         s++;
-                        strcpy(str_end, ">@");
-                        str_end[2] = '\0';
-                        vend = strstr(s, str_end);
+                        vend = strstr(s, ">@");
                         if(!vend) vend = strchr(s, '\0');
                         break;
                     case EXP_ESCAPE:
                         s++;
-                        strcpy(str_end, "]@");
-                        str_end[2] = '\0';
-                        vend = strstr(s, str_end);
+                        vend = strstr(s, "]@");
                         if(!vend) vend = strchr(s, '\0');
                         break;
                 }
+                assert(vend);
 
-                if(vend) {
-                    strncpy(ret, s, vend-s);
-                    ret[vend-s] = '\0';
-                }
+                ret = g_strndup(s, vend-s);
 
                 if(etype == EXP_SIMPLE_VAR ||
                    etype == EXP_BRACED_VAR) {
@@ -329,10 +320,10 @@ expand(char *s, guint recurse) {
                         g_error_free (err);
                     }
                     else if (*cmd_stdout) {
-                        int len = strlen(cmd_stdout);
+                        size_t len = strlen(cmd_stdout);
 
-                        if(cmd_stdout[len-1] == '\n')
-                            cmd_stdout[--len] = 0; /* strip trailing newline */
+                        if(len > 0 && cmd_stdout[len-1] == '\n')
+                            cmd_stdout[--len] = '\0'; /* strip trailing newline */
 
                         g_string_append(buf, cmd_stdout);
                         g_free(cmd_stdout);
@@ -362,6 +353,9 @@ expand(char *s, guint recurse) {
                     g_free(mycmd);
                     s = vend+2;
                 }
+
+                free(ret);
+                ret = NULL;
                 break;
 
             default:
@@ -914,6 +908,12 @@ set_mode_indicator() {
 }
 
 void
+update_indicator() {
+  set_mode_indicator();
+  update_title();
+}
+
+void
 set_insert_mode(gboolean mode) {
     uzbl.behave.insert_mode = mode;
     set_mode_indicator();
@@ -1408,7 +1408,7 @@ parse_command(const char *cmd, const char *param, GString *result) {
 
                 c->function(uzbl.gui.web_view, a, result_print);
                 if (result_print->len)
-                    printf("%*s\n", result_print->len, result_print->str);
+                    printf("%*s\n", (int)result_print->len, result_print->str);
 
                 g_string_free(result_print, TRUE);
             } else {
@@ -2636,7 +2636,7 @@ initialize(int argc, char *argv[]) {
 
     if (uzbl.behave.print_version) {
         printf("Commit: %s\n", COMMIT);
-        exit(0);
+        exit(EXIT_SUCCESS);
     }
 
     /* initialize hash table */
@@ -2730,6 +2730,8 @@ main (int argc, char* argv[]) {
         retreive_geometry();
 
     gchar *uri_override = (uzbl.state.uri ? g_strdup(uzbl.state.uri) : NULL);
+    if (argc > 1 && !uzbl.state.uri)
+        uri_override = g_strdup(argv[1]);
     gboolean verbose_override = uzbl.state.verbose;
 
     settings_init ();
@@ -2750,7 +2752,7 @@ main (int argc, char* argv[]) {
         set_var_value("uri", uri_override);
         g_free(uri_override);
     } else if (uzbl.state.uri)
-        cmd_load_uri(uzbl.gui.web_view, NULL);
+        cmd_load_uri();
 
     gtk_main ();
     clean_up();