From 5145f5d66468d759fd3fe3dab1b933dde5321696 Mon Sep 17 00:00:00 2001 From: VaclavT Date: Sun, 14 Feb 2021 13:02:11 +0100 Subject: [PATCH] first version of system-cmd --- Readme.md | 6 ++++-- debug.lisp | 53 +++++++++++++++++++++++++++++++++++++++++++---------- ml.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 12 deletions(-) diff --git a/Readme.md b/Readme.md index ec43763..f95b37d 100644 --- a/Readme.md +++ b/Readme.md @@ -1,6 +1,5 @@ ### TODO -- construct list for parse-csv in csvparse.cpp instead of ml.cpp - support for strings with " included - documentation - add url of source/inspiration to clib/*.cpp @@ -10,13 +9,16 @@ - prejmenovat ivaluize - add some debug support?? - add instrumentation (time, nr of evals, debug info, debug environment etc) +- in cating functions (as_string..) better exception description +- add fuctions asecond,third, fourth... +- add better print (syntaxhighligting) #### Functionality - readline - execute system command - printf - env -- support for including lib +- support for including lisp lib - date support - file functions - name it here diff --git a/debug.lisp b/debug.lisp index da3c5bd..2acd882 100644 --- a/debug.lisp +++ b/debug.lisp @@ -1,24 +1,57 @@ (print "Debug starts") -(define json_list (read-json "{\"k1\":\"v1\", \"k2\":42, \"k3\":[\"a\",123,true,false,null]}")) -(print json_list) -(for x json_list - (print x)) +; define a function `fact` that takes an argument `n` +; (defun fact (n) +; (if (<= n 1) +; 1 +; (* n (fact (- n 1))) +; )) +; (print (fact 5)) + + +; (define json_list (read-json "{\"k1\":\"v1\", \"k2\":42, \"k3\":[\"a\",123,true,false,null]}")) +; (print json_list) +; (for x json_list +; (print x)) + +; nefunguje - api.nasdaq.com +;(define nasdaq_headers (quote (("Accept" "application/json, text/plain, */*") ("Connection" "keep-alive") ("Origin" "https://www.nasdaq.com/") ("User-Agent" "Mozilla/5.0 (Windows NT 10.0)")))) +;(define json_list2 (read-json (read-url "https://api.nasdaq.com/api/calendar/dividends/?date=2021-02-01" nasdaq_headers))) +; (for x json_list2 +; (print x)) ;; (include "tmp/example.lisp") ;; (print "sorted: " (qs '(10 9 8 7 6 5 4 3 2 1))) -;; (define csv (read-file "tmp/data.csv")) -;; ; (print csv) -;; (define csv_list (parse-csv csv)) -;; ; (print csv_list) -;; (for x csv_list -;; (print x)) + +; (define csv (read-file "tmp/data.csv")) +; (define csv_list (parse-csv csv)) +; (for x csv_list +; (print x)) ;; (define web_page (read-url "https://query1.finance.yahoo.com/v7/finance/download/FDX?period1=1581272585&period2=1612894985&interval=1d&events=history&includeAdjustedClose=true")) ;; (print web_page) ;; (define fdx_list (parse-csv (index web_page 1))) ;; (print fdx_list) + +(define curl "curl -H \"Accept: application/json, text/plain, */*\" -H \"Origin: https://www.nasdaq.com/\" -H \"User-Agent: Mozilla/5.0 (Windows NT 10.0)\" https://api.nasdaq.com/api/calendar/dividends/?date=2021-02-01 2>/dev/null") +(define curl_out (system-cmd curl)) +(define json_list (read-json (last curl_out))) +;(print json_list) +(define data (first json_list)) +;(print data) +;(print (index data 1)) ; druhy prvek +(define calendar (index data 1)) +;(print calendar) +(define calendar_data (index (index calendar 0) 1)) +;(print calendar_data) +(define header (index (index calendar_data 0) 1)) +;(print header) +(define rows (index (index calendar_data 1) 1)) +;(print rows) +(for x rows + (print x)) + (print "Debug ends") diff --git a/ml.cpp b/ml.cpp index 626f444..143f4bb 100644 --- a/ml.cpp +++ b/ml.cpp @@ -1213,6 +1213,47 @@ namespace builtin { return json.ivalualize(); } + // Execute system command + MlValue system_cmd(std::vector args, MlEnvironment &env) { + eval_args(args, env); + + // TODO add support for more params constructing options as one string + // TODO add support for stderr + if (args.size() != 1) + throw MlError(MlValue("system-cmd", system_cmd), env, args.size() > 1 ? TOO_MANY_ARGS : TOO_FEW_ARGS); + + std::string cmd = args[0].as_string(); + + std::string cmd_output = ""; + int stat; + + // TODO better parameter here + // TODO handle reading of stderr + // https://stackoverflow.com/questions/478898/how-do-i-execute-a-command-and-get-the-output-of-the-command-within-c-using-po + // https://jineshkj.wordpress.com/2006/12/22/how-to-capture-stdin-stdout-and-stderr-of-child-program/ + char buffer[128]; + FILE *pipe = popen(cmd.c_str(), "r"); + if (!pipe) + throw std::runtime_error("popen() failed!"); + try { + while (!std::feof(pipe)) { + if (std::fgets(buffer, 128, pipe) != nullptr) + cmd_output += buffer; + } + } catch (...) { + stat = pclose(pipe); + throw; + } + stat = pclose(pipe); + int cmd_retval = WEXITSTATUS(stat); + + // TODO add helper function for this + std::vector lst; + lst.push_back(MlValue(cmd_retval)); + lst.push_back(MlValue::string(cmd_output)); + return lst; + } + // Read a file and execute its code MlValue include(std::vector args, MlEnvironment &env) { @@ -1738,6 +1779,7 @@ MlValue MlEnvironment::get(const std::string& name) const { if (name == "write-file") return MlValue("write-file", builtin::write_file); if (name == "read-url") return MlValue("read-url", builtin::read_url); if (name == "read-json") return MlValue("read-json", builtin::read_json); + if (name == "system-cmd") return MlValue("system-cmd", builtin::system_cmd); #endif // String operations