about summary refs log tree commit diff
diff options
context:
space:
mode:
authorChristoph Lohmann <20h@r-36.net>2012-10-31 21:13:50 +0100
committerChristoph Lohmann <20h@r-36.net>2012-10-31 21:13:50 +0100
commit4ce3808684c5ea5d14eab0c3e24119784d2ae255 (patch)
tree798f6f8bbeb49552bba1618883c6168803c7a1d1
parentAdd different progress colors when using proxy. (diff)
downloadsurf-4ce3808684c5ea5d14eab0c3e24119784d2ae255.tar.gz
surf-4ce3808684c5ea5d14eab0c3e24119784d2ae255.tar.bz2
surf-4ce3808684c5ea5d14eab0c3e24119784d2ae255.zip
Add options for scriptfile, cookiefile and stylefile. And changing the default
behaviour of buildpath to be more like in open().
-rw-r--r--arg.h41
-rw-r--r--surf.112
-rw-r--r--surf.c98
3 files changed, 109 insertions, 42 deletions
diff --git a/arg.h b/arg.h
new file mode 100644
index 0000000..6414822
--- /dev/null
+++ b/arg.h
@@ -0,0 +1,41 @@
+/*
+ * Copy me if you can.
+ * by 20h
+ */
+
+#ifndef __ARG_H__
+#define __ARG_H__
+
+extern char *argv0;
+
+#define USED(x) ((void)(x))
+
+#define ARGBEGIN	for (argv0 = *argv, argv++, argc--;\
+					argv[0] && argv[0][1]\
+					&& argv[0][0] == '-';\
+					argc--, argv++) {\
+				char _argc;\
+				char **_argv;\
+				if (argv[0][1] == '-' && argv[0][2] == '\0') {\
+					argv++;\
+					argc--;\
+					break;\
+				}\
+				for (argv[0]++, _argv = argv; argv[0][0];\
+						argv[0]++) {\
+					if (_argv != argv)\
+						break;\
+					_argc = argv[0][0];\
+					switch (_argc)
+
+#define ARGEND			}\
+				USED(_argc);\
+			}\
+			USED(argv);\
+			USED(argc);
+
+#define EARGF(x)	((argv[1] == NULL)? ((x), abort(), (char *)0) :\
+			(argc--, argv++, argv[0]))
+
+#endif
+
diff --git a/surf.1 b/surf.1
index 8cf8c28..6cd4044 100644
--- a/surf.1
+++ b/surf.1
@@ -3,10 +3,13 @@
 surf \- simple webkit-based browser
 .SH SYNOPSIS
 .B surf
+.RB [-c\ cookiefile]
 .RB [-e\ xid]
 .RB [-i]
 .RB [-p]
+.RB [-r\ scriptfile]
 .RB [-s]
+.RB [-t\ stylefile]
 .RB [-v]
 .RB [-x]
 .RB "URI"
@@ -17,6 +20,9 @@ which makes it possible to embed it in another application. Furthermore,
 one can point surf to another URI by setting its XProperties.
 .SH OPTIONS
 .TP
+.B \-c cookiefile 
+Specify the cookiefile to use.
+.TP
 .B \-e xid
 Reparents to window specified by xid.
 .TP
@@ -26,9 +32,15 @@ Disable Images
 .B \-p
 Disable Plugins
 .TP
+.B \-r scriptfile 
+Specify the user scriptfile.
+.TP
 .B \-s
 Disable Javascript
 .TP
+.B \-t stylefile
+Specify the user stylefile.
+.TP
 .B \-v
 Prints version information to standard output, then exits.
 .TP
diff --git a/surf.c b/surf.c
index 4247de2..3b291b5 100644
--- a/surf.c
+++ b/surf.c
@@ -20,6 +20,10 @@
 #include <JavaScriptCore/JavaScript.h>
 #include <sys/file.h>
 
+#include "arg.h"
+
+char *argv0;
+
 #define LENGTH(x)               (sizeof x / sizeof x[0])
 #define COOKIEJAR_TYPE          (cookiejar_get_type ())
 #define COOKIEJAR(obj)          (G_TYPE_CHECK_INSTANCE_CAST ((obj), COOKIEJAR_TYPE, CookieJar))
@@ -74,7 +78,6 @@ static Client *clients = NULL;
 static GdkNativeWindow embed = 0;
 static gboolean showxid = FALSE;
 static char winid[64];
-static char *progname;
 static gboolean loadimage = 1, plugin = 1, script = 1, using_proxy = 0;
 
 static char *buildpath(const char *path);
@@ -138,10 +141,19 @@ buildpath(const char *path) {
 	FILE *f;
 
 	/* creating directory */
-	if(path[0] == '/')
+	if(path[0] == '/') {
 		apath = g_strdup(path);
-	else
-		apath = g_strconcat(g_get_home_dir(), "/", path, NULL);
+	} else if(path[0] == '~') {
+		if(path[1] == '/') {
+			apath = g_strconcat(g_get_home_dir(), &path[1], NULL);
+		} else {
+			apath = g_strconcat(g_get_home_dir(), "/",
+					&path[1], NULL);
+		}
+	} else {
+		apath = g_strconcat(g_get_current_dir(), "/", path, NULL);
+	}
+
 	if((p = strrchr(apath, '/'))) {
 		*p = '\0';
 		g_mkdir_with_parents(apath, 0700);
@@ -153,6 +165,7 @@ buildpath(const char *path) {
 		g_chmod(apath, 0600); /* always */
 		fclose(f);
 	}
+
 	return apath;
 }
 
@@ -216,7 +229,7 @@ cookiejar_new(const char *filename, gboolean read_only) {
 	return g_object_new(COOKIEJAR_TYPE,
 	                    SOUP_COOKIE_JAR_TEXT_FILENAME, filename,
 	                    SOUP_COOKIE_JAR_READ_ONLY, read_only, NULL);
-} 
+}
 
 static void
 cookiejar_set_property(GObject *self, guint prop_id, const GValue *value, GParamSpec *pspec) {
@@ -628,7 +641,7 @@ newwindow(Client *c, const Arg *arg, gboolean noembed) {
 	const Arg a = { .v = (void *)cmd };
 	char tmp[64];
 
-	cmd[i++] = progname;
+	cmd[i++] = argv0;
 	if(embed && !noembed) {
 		cmd[i++] = "-e";
 		snprintf(tmp, LENGTH(tmp), "%u\n", (int)embed);
@@ -905,7 +918,8 @@ updatewinid(Client *c) {
 void
 usage(void) {
 	fputs("surf - simple browser\n", stderr);
-	die("usage: surf [-e xid] [-i] [-p] [-s] [-v] [-x] [uri]\n");
+	die("usage: surf [-c cookiefile] [-e xid] [-i] [-p] [-r scriptfile]"
+		" [-s] [-t stylefile] [-v] [-x] [uri]\n");
 }
 
 void
@@ -928,49 +942,49 @@ zoom(Client *c, const Arg *arg) {
 
 int
 main(int argc, char *argv[]) {
-	int i;
 	Arg arg;
 
-	progname = argv[0];
 	/* command line args */
-	for(i = 1, arg.v = NULL; i < argc && argv[i][0] == '-' &&
-			argv[i][1] != '\0' && argv[i][2] == '\0'; i++) {
-		if(!strcmp(argv[i], "--")) {
-			i++;
-			break;
-		}
-		switch(argv[i][1]) {
-		case 'e':
-			if(++i < argc)
-				embed = strtol(argv[i], NULL, 0);
-			else
-				usage();
-			break;
-		case 'i':
-			loadimage = 0;
-			break;
-		case 'p':
-			plugin = 0;
-			break;
-		case 's':
-			script = 0;
-			break;
-		case 'x':
-			showxid = TRUE;
-			break;
-		case 'v':
-			die("surf-"VERSION", ©2009-2012 surf engineers, see LICENSE for details\n");
-		default:
-			usage();
-		}
-	}
-	if(i < argc)
-		arg.v = argv[i];
+	ARGBEGIN {
+	case 'c':
+		cookiefile = EARGF(usage());
+		break;
+	case 'e':
+		embed = strtol(EARGF(usage()), NULL, 0);
+		break;
+	case 'i':
+		loadimage = 0;
+		break;
+	case 'p':
+		plugin = 0;
+		break;
+	case 'r':
+		scriptfile = EARGF(usage());
+		break;
+	case 's':
+		script = 0;
+		break;
+	case 't':
+		stylefile = EARGF(usage());
+		break;
+	case 'x':
+		showxid = TRUE;
+		break;
+	case 'v':
+		die("surf-"VERSION", ©2009-2012 surf engineers, see LICENSE for details\n");
+	default:
+		usage();
+	} ARGEND;
+	if(argc > 0)
+		arg.v = argv[0];
+
 	setup();
 	newclient();
 	if(arg.v)
 		loaduri(clients, &arg);
 	gtk_main();
 	cleanup();
+
 	return EXIT_SUCCESS;
 }
+