added missing urlencode, thanks sl for checking this - 9base - revived minimali… | |
git clone git://git.suckless.org/9base | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 51cdf1141edd627428ecf0b8bd643142dd5c3773 | |
parent 19a07111123964b50fff2644882430398fded904 | |
Author: [email protected] <unknown> | |
Date: Thu, 1 Nov 2012 18:42:41 +0100 | |
added missing urlencode, thanks sl for checking this | |
Diffstat: | |
A urlencode/Makefile | 10 ++++++++++ | |
A urlencode/urlencode.1 | 20 ++++++++++++++++++++ | |
A urlencode/urlencode.c | 103 +++++++++++++++++++++++++++++… | |
3 files changed, 133 insertions(+), 0 deletions(-) | |
--- | |
diff --git a/urlencode/Makefile b/urlencode/Makefile | |
@@ -0,0 +1,10 @@ | |
+# urlencode - url encode and decode files | |
+# Depends on ../lib9 | |
+ | |
+TARG = urlencode | |
+ | |
+include ../std.mk | |
+ | |
+pre-uninstall: | |
+ | |
+post-install: | |
diff --git a/urlencode/urlencode.1 b/urlencode/urlencode.1 | |
@@ -0,0 +1,20 @@ | |
+.TH URLENCODE 1 | |
+.SH NAME | |
+urlencode \- URL encode and decode files | |
+.SH SYNOPSIS | |
+.B urlencode | |
+[ | |
+.B -d | |
+] [ | |
+.I file | |
+] | |
+.SH DESCRIPTION | |
+.I Urlencode | |
+is a helper program to URL encode and decode files. The | |
+.B -d | |
+flag insead of encoding, decodes URL encoded file. If no | |
+.I file | |
+is given, standard input is read. The resulting data | |
+is written to standard output. | |
+.SH SOURCE | |
+.B \*9/src/urlencode/urlencode.c | |
diff --git a/urlencode/urlencode.c b/urlencode/urlencode.c | |
@@ -0,0 +1,103 @@ | |
+#include <u.h> | |
+#include <libc.h> | |
+#include <bio.h> | |
+ | |
+Biobuf bin; | |
+Biobuf bout; | |
+int dflag; | |
+ | |
+char hex[] = "0123456789abcdef"; | |
+char Hex[] = "0123456789ABCDEF"; | |
+ | |
+int | |
+hexdigit(int c) | |
+{ | |
+ char *p; | |
+ | |
+ if(c > 0){ | |
+ if((p = strchr(Hex, c)) != 0) | |
+ return p - Hex; | |
+ if((p = strchr(hex, c)) != 0) | |
+ return p - hex; | |
+ } | |
+ return -1; | |
+} | |
+ | |
+void | |
+usage(void) | |
+{ | |
+ fprint(2, "Usage: %s [ -d ] [ file ]\n", argv0); | |
+ exits("usage"); | |
+} | |
+ | |
+void | |
+main(int argc, char *argv[]) | |
+{ | |
+ int c; | |
+ | |
+ ARGBEGIN { | |
+ case 'd': | |
+ dflag = 1; | |
+ break; | |
+ default: | |
+ usage(); | |
+ } ARGEND; | |
+ | |
+ if(argc == 1){ | |
+ int fd; | |
+ | |
+ fd = open(*argv, OREAD); | |
+ if(fd < 0) | |
+ sysfatal("%r"); | |
+ if(fd != 0) dup(fd, 0); | |
+ } else if(argc > 1) | |
+ usage(); | |
+ | |
+ Binit(&bin, 0, OREAD); | |
+ Binit(&bout, 1, OWRITE); | |
+ | |
+ if(dflag){ | |
+ while((c = Bgetc(&bin)) >= 0){ | |
+ if(c == '%'){ | |
+ int c1, c2, x1, x2; | |
+ | |
+ if((c1 = Bgetc(&bin)) < 0) | |
+ break; | |
+ if((x1 = hexdigit(c1)) < 0){ | |
+ Bungetc(&bin); | |
+ Bputc(&bout, c); | |
+ continue; | |
+ } | |
+ if((c2 = Bgetc(&bin)) < 0) | |
+ break; | |
+ if((x2 = hexdigit(c2)) < 0){ | |
+ Bungetc(&bin); | |
+ Bputc(&bout, c); | |
+ Bputc(&bout, c1); | |
+ continue; | |
+ } | |
+ c = x1<<4 | x2; | |
+ } else if(c == '+') | |
+ c = ' '; | |
+ Bputc(&bout, c); | |
+ } | |
+ } else { | |
+ while((c = Bgetc(&bin)) >= 0){ | |
+ if(c>0 && strchr("/$-_@.!*'(),", c) | |
+ || 'a'<=c && c<='z' | |
+ || 'A'<=c && c<='Z' | |
+ || '0'<=c && c<='9') | |
+ Bputc(&bout, c); | |
+ else if(c == ' ') | |
+ Bputc(&bout, '+'); | |
+ else { | |
+ Bputc(&bout, '%'); | |
+ Bputc(&bout, Hex[c>>4]); | |
+ Bputc(&bout, Hex[c&15]); | |
+ } | |
+ } | |
+ } | |
+ | |
+ Bflush(&bout); | |
+ exits(0); | |
+} |