]> granicus.if.org Git - jq/commitdiff
Add `env` builtin
authorNicolas Williams <nico@cryptonector.com>
Fri, 13 Jun 2014 22:51:41 +0000 (17:51 -0500)
committerNicolas Williams <nico@cryptonector.com>
Fri, 13 Jun 2014 22:51:41 +0000 (17:51 -0500)
builtin.c
docs/content/3.manual/manual.yml

index 274576bca463ffc44e81ffb54941ae18b561189e..f50cbca81ec930fa701ed4c00b6f5a49d355b5a3 100644 (file)
--- a/builtin.c
+++ b/builtin.c
@@ -1,7 +1,8 @@
+#include <assert.h>
+#include <limits.h>
 #include <math.h>
 #include <stdlib.h>
 #include <string.h>
-#include <assert.h>
 #include "builtin.h"
 #include "compile.h"
 #include "jq_parser.h"
@@ -575,6 +576,23 @@ static jv f_error(jv input, jv msg) {
   return jv_invalid_with_msg(msg);
 }
 
+extern const char **environ;
+
+static jv f_env(jv input) {
+  jv_free(input);
+  jv env = jv_object();
+  const char *var, *val;
+  for (const char **e = environ; *e != NULL; e++) {
+    var = e[0];
+    val = strchr(e[0], '=');
+    if (val == NULL)
+      env = jv_object_set(env, jv_string(var), jv_null());
+    else if (var - val < INT_MAX)
+      env = jv_object_set(env, jv_string_sized(var, val - var), jv_string(val + 1));
+  }
+  return env;
+}
+
 #define LIBM_DD(name) \
   {(cfunction_ptr)f_ ## name, "_" #name, 1},
    
@@ -620,6 +638,7 @@ static const struct cfunction function_list[] = {
   {(cfunction_ptr)f_max_by_impl, "_max_by_impl", 2},
   {(cfunction_ptr)f_error, "error", 2},
   {(cfunction_ptr)f_format, "format", 2},
+  {(cfunction_ptr)f_env, "env", 1},
 };
 #undef LIBM_DD
 
index caeb58a1d913c1eb40973df7f988605097e3e27b..5bcce3ff3de6eef5598d7c6d77c6840abe841763 100644 (file)
@@ -1172,6 +1172,16 @@ sections:
             input: '[[{"a":1}]]'
             output: ['1']
 
+      - title: "`env`"
+        body: |
+          
+          Outputs an object representing jq's environment.
+
+        examples:
+          - program: 'env.PAGER'
+            input: 'null'
+            output: ['"less"']
+
       - title: "String interpolation - `\\(foo)`"
         body: |