[vte/wip/issue-206: 1/4] prompt: Add a vte-urlencode utility



commit 5ba39d85ffc3725adb4da2bfb1b8a655c5913c55
Author: Carlos Santos <casantos redhat com>
Date:   Mon Jan 20 21:13:24 2020 +0100

    prompt: Add a vte-urlencode utility
    
    This allows us to add a tcsh counterpart of vte.sh, which is currently
    missing and is hard to implement due to tcsh scripting limitations (no
    support for functions).
    
    An external utility is more expensive than a function, since it requires
    a fork/exec, but __vte_urlencode in vte.sh already forks a subshell to
    set LC_ALL to "C", which has almost the same cost.

 src/meson.build      | 17 +++++++++++++++++
 src/vte-urlencode.cc | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 70 insertions(+)
---
diff --git a/src/meson.build b/src/meson.build
index 428afac6..1f5e5c96 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -340,6 +340,23 @@ reflect_vte = executable(
   install: false,
 )
 
+# vte-urlencode
+
+vte_urlencode_sources = files(
+  'vte-urlencode.cc',
+)
+
+vte_urlencode = executable(
+  'vte-urlencode',
+  cpp_args: [
+    '-nostdlib',
+  ],
+  include_directories: [top_inc,],
+  install: true,
+  install_dir: vte_libexecdir,
+  sources: vte_urlencode_sources,
+)
+
 # xticker
 
 xticker_sources = files(
diff --git a/src/vte-urlencode.cc b/src/vte-urlencode.cc
new file mode 100644
index 00000000..8b93ddc6
--- /dev/null
+++ b/src/vte-urlencode.cc
@@ -0,0 +1,53 @@
+/*
+ * Copyright © 2019 Red Hat, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Red Hat Author(s): Carlos Santos
+ */
+
+#include "config.h"
+
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+#include <ctype.h>
+
+#define SPECIALS "/:_.-!'()~"
+
+int
+main(int argc,
+     char *argv[])
+{
+        /* Note that we're not calling setlocale(LC_ALL, "") here on purpose,
+         * since we WANT this to run under C locale.
+         */
+
+        auto pwd = getenv("PWD");
+        if (pwd == nullptr) {
+                fprintf(stderr, "PWD environment variable not set");
+                return EXIT_FAILURE;
+        }
+
+        auto ch = int{};
+        while ((ch = *pwd++ & 0xff)) {
+                if (isalnum(ch) || strchr(SPECIALS, ch)) {
+                        putchar(ch);
+                } else {
+                        printf("%%%02X", ch);
+                }
+        }
+
+        return EXIT_SUCCESS;
+}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]