From 1837e89fe4628d79c0b388e6bf7f066b71758f8f Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sun, 6 Sep 2020 15:20:48 -0500 Subject: [PATCH] Address #470 - hyphen's in native module names. --- jpm | 15 +++++++++++--- test/install/project.janet | 4 ++++ test/install/testexec.janet | 3 ++- test/install/testmod4.c | 40 +++++++++++++++++++++++++++++++++++++ 4 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 test/install/testmod4.c diff --git a/jpm b/jpm index f30a84f6..d03844b9 100755 --- a/jpm +++ b/jpm @@ -132,6 +132,15 @@ "Convert url with potential bad characters into a file path element." (peg/compile ~(% (any (+ (/ '(set "<>:\"/\\|?*") "_") '1))))) +(def- entry-replacer + "Convert url with potential bad characters into an entry-name" + (peg/compile ~(% (any (+ '(range "AZ" "az" "09" "__") (/ '1 ,|(string "_" ($ 0) "_"))))))) + +(defn entry-replace + "Escape special characters in the entry-name" + [name] + (get (peg/match entry-replacer name) 0)) + (defn filepath-replace "Remove special characters from a string or path to make it into a path segment." @@ -440,14 +449,14 @@ (defn- entry-name "Name of symbol that enters static compilation of a module." [name] - (string "janet_module_entry_" (filepath-replace name))) + (string "janet_module_entry_" (entry-replace name))) (defn- compile-c "Compile a C file into an object file." [opts src dest &opt static?] (def cc (opt opts :compiler default-compiler)) (def cflags [;(getcflags opts) ;(if static? [] dynamic-cflags)]) - (def entry-defines (if-let [n (opts :entry-name)] + (def entry-defines (if-let [n (and static? (opts :entry-name))] [(make-define "JANET_ENTRY_NAME" n)] [])) (def defines [;(make-defines (opt opts :defines {})) ;entry-defines]) @@ -465,7 +474,7 @@ [opts src dest &opt static?] (def cpp (opt opts :cpp-compiler default-cpp-compiler)) (def cflags [;(getcppflags opts) ;(if static? [] dynamic-cflags)]) - (def entry-defines (if-let [n (opts :entry-name)] + (def entry-defines (if-let [n (and static? (opts :entry-name))] [(make-define "JANET_ENTRY_NAME" n)] [])) (def defines [;(make-defines (opt opts :defines {})) ;entry-defines]) diff --git a/test/install/project.janet b/test/install/project.janet index 916abfda..5f3ce572 100644 --- a/test/install/project.janet +++ b/test/install/project.janet @@ -13,6 +13,10 @@ :name "testmod3" :source @["testmod3.cpp"]) +(declare-native + :name "test-mod-4" + :source @["testmod4.c"]) + (declare-executable :name "testexec" :entry "testexec.janet") diff --git a/test/install/testexec.janet b/test/install/testexec.janet index 045a6e4e..4f4c5020 100644 --- a/test/install/testexec.janet +++ b/test/install/testexec.janet @@ -1,7 +1,8 @@ (use build/testmod) (use build/testmod2) (use build/testmod3) +(use build/test-mod-4) (defn main [&] (print "Hello from executable!") - (print (+ (get5) (get6) (get7)))) + (print (+ (get5) (get6) (get7) (get8)))) diff --git a/test/install/testmod4.c b/test/install/testmod4.c new file mode 100644 index 00000000..b29249dd --- /dev/null +++ b/test/install/testmod4.c @@ -0,0 +1,40 @@ +/* +* Copyright (c) 2020 Calvin Rose and contributors +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to +* deal in the Software without restriction, including without limitation the +* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +* sell copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +* IN THE SOFTWARE. +*/ + +/* A very simple native module */ + +#include + +static Janet cfun_get_eight(int32_t argc, Janet *argv) { + (void) argv; + janet_fixarity(argc, 0); + return janet_wrap_number(8.0); +} + +static const JanetReg array_cfuns[] = { + {"get8", cfun_get_eight, NULL}, + {NULL, NULL, NULL} +}; + +JANET_MODULE_ENTRY(JanetTable *env) { + janet_cfuns(env, NULL, array_cfuns); +}