mirror of
https://github.com/janet-lang/janet
synced 2025-11-19 00:35:11 +00:00
Compare commits
1 Commits
math-funct
...
cuddled-sy
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2739605184 |
11
CHANGELOG.md
11
CHANGELOG.md
@@ -1,17 +1,6 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
## Unreleased - ???
|
|
||||||
- Add `math/erf`
|
|
||||||
- Add `math/erfc`
|
|
||||||
- Add `math/log1p`
|
|
||||||
- Add `math/next`
|
|
||||||
- Add os/umask
|
|
||||||
- Add os/perm-int
|
|
||||||
- Add os/perm-string
|
|
||||||
- Add :octal-permissions option for os/stat.
|
|
||||||
- Add `jpm repl` subcommand, as well as `post-deps` macro in project.janet files.
|
|
||||||
|
|
||||||
## 1.8.1 - 2020-03-31
|
## 1.8.1 - 2020-03-31
|
||||||
- Fix bugs for big endian systems
|
- Fix bugs for big endian systems
|
||||||
- Fix 1.8.0 regression on BSDs
|
- Fix 1.8.0 regression on BSDs
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ install:
|
|||||||
- call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" %platform%
|
- call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" %platform%
|
||||||
- build_win test-install
|
- build_win test-install
|
||||||
- set janet_outname=%appveyor_repo_tag_name%
|
- set janet_outname=%appveyor_repo_tag_name%
|
||||||
- if "%janet_outname%"=="" set /P janet_outname=<build\version.txt
|
- if "%janet_outname%"=="" set janet_outname=v1.8.1
|
||||||
build: off
|
build: off
|
||||||
|
|
||||||
artifacts:
|
artifacts:
|
||||||
@@ -49,7 +49,8 @@ artifacts:
|
|||||||
- name: "janet-$(janet_outname)-windows-%platform%"
|
- name: "janet-$(janet_outname)-windows-%platform%"
|
||||||
path: dist
|
path: dist
|
||||||
type: Zip
|
type: Zip
|
||||||
- path: "janet-$(janet_outname)-windows-%platform%-installer.exe"
|
- path: "janet-$(janet_outname)-windows-installer.exe"
|
||||||
|
name: "janet-$(janet_outname)-windows-%platform%-installer.exe"
|
||||||
type: File
|
type: File
|
||||||
|
|
||||||
deploy:
|
deploy:
|
||||||
|
|||||||
77
auxbin/jpm
77
auxbin/jpm
@@ -181,12 +181,11 @@
|
|||||||
(put into k (x k))))
|
(put into k (x k))))
|
||||||
into)
|
into)
|
||||||
|
|
||||||
(defn require-jpm
|
(defn import-rules
|
||||||
"Require a jpm file project file. This is different from a normal require
|
"Import another file that defines more rules. This ruleset
|
||||||
in that code is loaded in the jpm environment."
|
is merged into the current ruleset."
|
||||||
[path &opt no-deps]
|
[path]
|
||||||
(def env (make-env))
|
(def env (make-env))
|
||||||
(put env :jpm-no-deps no-deps)
|
|
||||||
(unless (os/stat path :mode)
|
(unless (os/stat path :mode)
|
||||||
(error (string "cannot open " path)))
|
(error (string "cannot open " path)))
|
||||||
(loop [k :keys _env :when (symbol? k)]
|
(loop [k :keys _env :when (symbol? k)]
|
||||||
@@ -195,24 +194,9 @@
|
|||||||
(loop [k :keys currenv :when (keyword? k)]
|
(loop [k :keys currenv :when (keyword? k)]
|
||||||
(put env k (currenv k)))
|
(put env k (currenv k)))
|
||||||
(dofile path :env env :exit true)
|
(dofile path :env env :exit true)
|
||||||
env)
|
|
||||||
|
|
||||||
(defn import-rules
|
|
||||||
"Import another file that defines more rules. This ruleset
|
|
||||||
is merged into the current ruleset."
|
|
||||||
[path &opt no-deps]
|
|
||||||
(def env (require-jpm path no-deps))
|
|
||||||
(when-let [rules (env :rules)] (merge-into (getrules) rules))
|
(when-let [rules (env :rules)] (merge-into (getrules) rules))
|
||||||
env)
|
env)
|
||||||
|
|
||||||
(defmacro post-deps
|
|
||||||
"Run code at the top level if jpm dependencies are installed. Build
|
|
||||||
code that imports dependencies should be wrapped with this macro, as project.janet
|
|
||||||
needs to be able to run successfully even without dependencies installed."
|
|
||||||
[& body]
|
|
||||||
(unless (dyn :jpm-no-deps)
|
|
||||||
~',(reduce |(eval $1) nil body)))
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# OS and shell helpers
|
# OS and shell helpers
|
||||||
#
|
#
|
||||||
@@ -815,15 +799,13 @@ int main(int argc, const char **argv) {
|
|||||||
is marshalled into bytecode which is then embedded in a final executable for distribution.\n\n
|
is marshalled into bytecode which is then embedded in a final executable for distribution.\n\n
|
||||||
This executable can be installed as well to the --binpath given."
|
This executable can be installed as well to the --binpath given."
|
||||||
[&keys {:install install :name name :entry entry :headers headers
|
[&keys {:install install :name name :entry entry :headers headers
|
||||||
:cflags cflags :lflags lflags :deps deps}]
|
:cflags cflags :lflags lflags}]
|
||||||
(def name (if is-win (string name ".exe") name))
|
(def name (if is-win (string name ".exe") name))
|
||||||
(def dest (string "build" sep name))
|
(def dest (string "build" sep name))
|
||||||
(create-executable @{:cflags cflags :lflags lflags} entry dest)
|
(create-executable @{:cflags cflags :lflags lflags} entry dest)
|
||||||
(add-dep "build" dest)
|
(add-dep "build" dest)
|
||||||
(when headers
|
(when headers
|
||||||
(each h headers (add-dep dest h)))
|
(each h headers (add-dep dest h)))
|
||||||
(when deps
|
|
||||||
(each d deps (add-dep dest d)))
|
|
||||||
(when install
|
(when install
|
||||||
(install-rule dest (dyn :binpath JANET_BINPATH))))
|
(install-rule dest (dyn :binpath JANET_BINPATH))))
|
||||||
|
|
||||||
@@ -930,8 +912,8 @@ int main(int argc, const char **argv) {
|
|||||||
'(* "--" '(some (if-not "=" 1)) (+ (* "=" '(any 1)) -1))))
|
'(* "--" '(some (if-not "=" 1)) (+ (* "=" '(any 1)) -1))))
|
||||||
|
|
||||||
(defn- local-rule
|
(defn- local-rule
|
||||||
[rule &opt no-deps]
|
[rule]
|
||||||
(import-rules "./project.janet" no-deps)
|
(import-rules "./project.janet")
|
||||||
(do-rule rule))
|
(do-rule rule))
|
||||||
|
|
||||||
(defn- help
|
(defn- help
|
||||||
@@ -966,8 +948,6 @@ Subcommands are:
|
|||||||
name is lockfile.janet.
|
name is lockfile.janet.
|
||||||
load-lockfile (lockfile) : Install modules from a lockfile in a reproducible way. The
|
load-lockfile (lockfile) : Install modules from a lockfile in a reproducible way. The
|
||||||
default lockfile name is lockfile.janet.
|
default lockfile name is lockfile.janet.
|
||||||
repl : Run a repl in the context of the current project.janet file. This lets you run rules and
|
|
||||||
otherwise debug the current project.janet file.
|
|
||||||
|
|
||||||
Keys are:
|
Keys are:
|
||||||
--modpath : The directory to install modules to. Defaults to $JANET_MODPATH, $JANET_PATH, or (dyn :syspath)
|
--modpath : The directory to install modules to. Defaults to $JANET_MODPATH, $JANET_PATH, or (dyn :syspath)
|
||||||
@@ -981,16 +961,15 @@ Keys are:
|
|||||||
--pkglist : URL of git repository for package listing. Defaults to $JANET_PKGLIST or https://github.com/janet-lang/pkgs.git
|
--pkglist : URL of git repository for package listing. Defaults to $JANET_PKGLIST or https://github.com/janet-lang/pkgs.git
|
||||||
|
|
||||||
Flags are:
|
Flags are:
|
||||||
--nocolor : Disable color in the jpm repl.
|
|
||||||
--verbose : Print shell commands as they are executed.
|
--verbose : Print shell commands as they are executed.
|
||||||
--test : If passed to jpm install, runs tests before installing. Will run tests recursively on dependencies.
|
--test : If passed to jpm install, runs tests before installing. Will run tests recursively on dependencies.
|
||||||
`))
|
`))
|
||||||
|
|
||||||
(defn show-help
|
(defn- show-help
|
||||||
[]
|
[]
|
||||||
(print help))
|
(print help))
|
||||||
|
|
||||||
(defn show-paths
|
(defn- show-paths
|
||||||
[]
|
[]
|
||||||
(print "binpath: " (dyn :binpath JANET_BINPATH))
|
(print "binpath: " (dyn :binpath JANET_BINPATH))
|
||||||
(print "modpath: " (dyn :modpath JANET_MODPATH))
|
(print "modpath: " (dyn :modpath JANET_MODPATH))
|
||||||
@@ -998,21 +977,21 @@ Flags are:
|
|||||||
(print "headerpath: " (dyn :headerpath JANET_HEADERPATH))
|
(print "headerpath: " (dyn :headerpath JANET_HEADERPATH))
|
||||||
(print "syspath: " (dyn :syspath)))
|
(print "syspath: " (dyn :syspath)))
|
||||||
|
|
||||||
(defn build
|
(defn- build
|
||||||
[]
|
[]
|
||||||
(local-rule "build"))
|
(local-rule "build"))
|
||||||
|
|
||||||
(defn clean
|
(defn- clean
|
||||||
[]
|
[]
|
||||||
(local-rule "clean"))
|
(local-rule "clean"))
|
||||||
|
|
||||||
(defn install
|
(defn- install
|
||||||
[&opt repo]
|
[&opt repo]
|
||||||
(if repo
|
(if repo
|
||||||
(install-git repo)
|
(install-git repo)
|
||||||
(local-rule "install")))
|
(local-rule "install")))
|
||||||
|
|
||||||
(defn test
|
(defn- test
|
||||||
[]
|
[]
|
||||||
(local-rule "test"))
|
(local-rule "test"))
|
||||||
|
|
||||||
@@ -1022,40 +1001,25 @@ Flags are:
|
|||||||
(uninstall what)
|
(uninstall what)
|
||||||
(local-rule "uninstall")))
|
(local-rule "uninstall")))
|
||||||
|
|
||||||
(defn deps
|
(defn- deps
|
||||||
[]
|
[]
|
||||||
(local-rule "install-deps" true))
|
(local-rule "install-deps"))
|
||||||
|
|
||||||
(defn list-rules
|
(defn- list-rules
|
||||||
[&opt ctx]
|
[]
|
||||||
(import-rules "./project.janet" true)
|
(import-rules "./project.janet")
|
||||||
(def ks (sort (seq [k :keys (dyn :rules)] k)))
|
(def ks (sort (seq [k :keys (dyn :rules)] k)))
|
||||||
(each k ks (print k)))
|
(each k ks (print k)))
|
||||||
|
|
||||||
(defn update-pkgs
|
(defn- update-pkgs
|
||||||
[]
|
[]
|
||||||
(install-git (dyn :pkglist default-pkglist)))
|
(install-git (dyn :pkglist default-pkglist)))
|
||||||
|
|
||||||
(defn quickbin
|
(defn- quickbin
|
||||||
[input output]
|
[input output]
|
||||||
(create-executable @{} input output)
|
(create-executable @{} input output)
|
||||||
(do-rule output))
|
(do-rule output))
|
||||||
|
|
||||||
(defn jpm-repl
|
|
||||||
[]
|
|
||||||
(def env (require-jpm "./project.janet"))
|
|
||||||
(def p (env :project))
|
|
||||||
(def name (p :name))
|
|
||||||
(setdyn :pretty-format (if-not (dyn :nocolor) "%.20Q" "%.20q"))
|
|
||||||
(setdyn :err-color (if-not (dyn :nocolor) true))
|
|
||||||
(print "Project: " name)
|
|
||||||
(print "Repository: " (p :repo))
|
|
||||||
(print "Author: " (p :author))
|
|
||||||
(defn getchunk [buf p]
|
|
||||||
(def [line] (parser/where p))
|
|
||||||
(getline (string "jpm[" name "]:" line ":" (parser/state p :delimiters) "> ") buf env))
|
|
||||||
(repl getchunk nil env))
|
|
||||||
|
|
||||||
(def- subcommands
|
(def- subcommands
|
||||||
{"build" build
|
{"build" build
|
||||||
"clean" clean
|
"clean" clean
|
||||||
@@ -1064,7 +1028,6 @@ Flags are:
|
|||||||
"test" test
|
"test" test
|
||||||
"help" help
|
"help" help
|
||||||
"deps" deps
|
"deps" deps
|
||||||
"repl" jpm-repl
|
|
||||||
"show-paths" show-paths
|
"show-paths" show-paths
|
||||||
"clear-cache" clear-cache
|
"clear-cache" clear-cache
|
||||||
"run" local-rule
|
"run" local-rule
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ exit /b 0
|
|||||||
@rem Run the installer. (Installs to the local user with default settings)
|
@rem Run the installer. (Installs to the local user with default settings)
|
||||||
:INSTALL
|
:INSTALL
|
||||||
@echo Running Installer...
|
@echo Running Installer...
|
||||||
FOR %%a in (janet-*-windows-*-installer.exe) DO (
|
FOR %%a in (janet-*-windows-installer.exe) DO (
|
||||||
%%a /S /CurrentUser
|
%%a /S /CurrentUser
|
||||||
)
|
)
|
||||||
exit /b 0
|
exit /b 0
|
||||||
|
|||||||
@@ -1,6 +1,3 @@
|
|||||||
# This file is invoked by build_win.bat
|
|
||||||
# Relevant configuration variables are set there.
|
|
||||||
|
|
||||||
Unicode True
|
Unicode True
|
||||||
|
|
||||||
!echo "Program Files: ${PROGRAMFILES}"
|
!echo "Program Files: ${PROGRAMFILES}"
|
||||||
@@ -23,9 +20,6 @@ VIFileVersion "${PRODUCT_VERSION}"
|
|||||||
|
|
||||||
!if ${SIXTYFOUR} == "true"
|
!if ${SIXTYFOUR} == "true"
|
||||||
!define MULTIUSER_USE_PROGRAMFILES64
|
!define MULTIUSER_USE_PROGRAMFILES64
|
||||||
!define PLATNAME "x64"
|
|
||||||
!else
|
|
||||||
!define PLATNAME "x86"
|
|
||||||
!endif
|
!endif
|
||||||
|
|
||||||
# Includes
|
# Includes
|
||||||
@@ -42,12 +36,12 @@ Name "Janet"
|
|||||||
!define DOLLAR "$"
|
!define DOLLAR "$"
|
||||||
!ifdef CHECK_${DOLLAR}%APPVEYOR_REPO_TAG_NAME%
|
!ifdef CHECK_${DOLLAR}%APPVEYOR_REPO_TAG_NAME%
|
||||||
# We are not in the appveyor environment, use version name
|
# We are not in the appveyor environment, use version name
|
||||||
!define OUTNAME_PART ${VERSION}
|
!define OUTNAME_PART v${VERSION}
|
||||||
!else
|
!else
|
||||||
# We are in appveyor, use git tag name for installer
|
# We are in appveyor, use git tag name for installer
|
||||||
!define OUTNAME_PART ${OUTNAME}
|
!define OUTNAME_PART ${OUTNAME}
|
||||||
!endif
|
!endif
|
||||||
OutFile "janet-${OUTNAME_PART}-windows-${PLATNAME}-installer.exe"
|
OutFile "janet-${OUTNAME_PART}-windows-installer.exe"
|
||||||
|
|
||||||
# Some Configuration
|
# Some Configuration
|
||||||
!define APPNAME "Janet"
|
!define APPNAME "Janet"
|
||||||
|
|||||||
9
jpm.1
9
jpm.1
@@ -24,10 +24,6 @@ More interesting are the local commands. For more information on jpm usage, see
|
|||||||
|
|
||||||
.SH FLAGS
|
.SH FLAGS
|
||||||
|
|
||||||
.TP
|
|
||||||
.BR \-\-nocolor
|
|
||||||
Disable color in the jpm repl.
|
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
.BR \-\-verbose
|
.BR \-\-verbose
|
||||||
Print detailed messages of what jpm is doing, including compilation commands and other shell commands.
|
Print detailed messages of what jpm is doing, including compilation commands and other shell commands.
|
||||||
@@ -158,11 +154,6 @@ The main function is the entry point of the program and will receive command lin
|
|||||||
as function arguments. The entry file can import other modules, including native C modules, and
|
as function arguments. The entry file can import other modules, including native C modules, and
|
||||||
jpm will attempt to include the dependencies into the generated executable.
|
jpm will attempt to include the dependencies into the generated executable.
|
||||||
|
|
||||||
.TP
|
|
||||||
.BR repl
|
|
||||||
Load the current project.janet file and start a repl in it's environment. This lets a user better
|
|
||||||
debug the project file, as well as run rules manually.
|
|
||||||
|
|
||||||
.SH ENVIRONMENT
|
.SH ENVIRONMENT
|
||||||
|
|
||||||
.B JANET_PATH
|
.B JANET_PATH
|
||||||
|
|||||||
@@ -942,7 +942,7 @@
|
|||||||
(reduce fop x forms))
|
(reduce fop x forms))
|
||||||
|
|
||||||
(defmacro -?>
|
(defmacro -?>
|
||||||
"Short circuit threading macro. Inserts x as the second value in the first form
|
"Short circuit threading macro. Inserts x as the last value in the first form
|
||||||
in forms, and inserts the modified first form into the second form
|
in forms, and inserts the modified first form into the second form
|
||||||
in the same manner, and so on. The pipeline will return nil
|
in the same manner, and so on. The pipeline will return nil
|
||||||
if an intermediate value is nil.
|
if an intermediate value is nil.
|
||||||
@@ -958,7 +958,7 @@
|
|||||||
(reduce fop x forms))
|
(reduce fop x forms))
|
||||||
|
|
||||||
(defmacro -?>>
|
(defmacro -?>>
|
||||||
"Short circuit threading macro. Inserts x as the last value in the first form
|
"Threading macro. Inserts x as the last value in the first form
|
||||||
in forms, and inserts the modified first form into the second form
|
in forms, and inserts the modified first form into the second form
|
||||||
in the same manner, and so on. The pipeline will return nil
|
in the same manner, and so on. The pipeline will return nil
|
||||||
if an intermediate value is nil.
|
if an intermediate value is nil.
|
||||||
|
|||||||
@@ -255,10 +255,6 @@ JANET_DEFINE_MATHOP(fabs, fabs)
|
|||||||
JANET_DEFINE_MATHOP(floor, floor)
|
JANET_DEFINE_MATHOP(floor, floor)
|
||||||
JANET_DEFINE_MATHOP(trunc, trunc)
|
JANET_DEFINE_MATHOP(trunc, trunc)
|
||||||
JANET_DEFINE_MATHOP(round, round)
|
JANET_DEFINE_MATHOP(round, round)
|
||||||
JANET_DEFINE_MATHOP(gamma, lgamma)
|
|
||||||
JANET_DEFINE_MATHOP(log1p, log1p)
|
|
||||||
JANET_DEFINE_MATHOP(erf, erf)
|
|
||||||
JANET_DEFINE_MATHOP(erfc, erfc)
|
|
||||||
|
|
||||||
#define JANET_DEFINE_MATH2OP(name, fop)\
|
#define JANET_DEFINE_MATH2OP(name, fop)\
|
||||||
static Janet janet_##name(int32_t argc, Janet *argv) {\
|
static Janet janet_##name(int32_t argc, Janet *argv) {\
|
||||||
@@ -271,7 +267,6 @@ static Janet janet_##name(int32_t argc, Janet *argv) {\
|
|||||||
JANET_DEFINE_MATH2OP(atan2, atan2)
|
JANET_DEFINE_MATH2OP(atan2, atan2)
|
||||||
JANET_DEFINE_MATH2OP(pow, pow)
|
JANET_DEFINE_MATH2OP(pow, pow)
|
||||||
JANET_DEFINE_MATH2OP(hypot, hypot)
|
JANET_DEFINE_MATH2OP(hypot, hypot)
|
||||||
JANET_DEFINE_MATH2OP(nextafter, nextafter)
|
|
||||||
|
|
||||||
static Janet janet_not(int32_t argc, Janet *argv) {
|
static Janet janet_not(int32_t argc, Janet *argv) {
|
||||||
janet_fixarity(argc, 1);
|
janet_fixarity(argc, 1);
|
||||||
@@ -443,26 +438,6 @@ static const JanetReg math_cfuns[] = {
|
|||||||
JDOC("(math/exp2 x)\n\n"
|
JDOC("(math/exp2 x)\n\n"
|
||||||
"Returns 2 to the power of x.")
|
"Returns 2 to the power of x.")
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"math/log1p", janet_log1p,
|
|
||||||
JDOC("(math/log1p x)\n\n"
|
|
||||||
"Returns (log base e of x) + 1 more accurately than (+ (math/log x) 1)")
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"math/gamma", janet_gamma,
|
|
||||||
JDOC("(math/gamma x)\n\n"
|
|
||||||
"Returns gamma(x).")
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"math/erfc", janet_erfc,
|
|
||||||
JDOC("(math/erfc x)\n\n"
|
|
||||||
"Returns the complementary error function of x.")
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"math/erf", janet_erf,
|
|
||||||
JDOC("(math/erf x)\n\n"
|
|
||||||
"Returns the error function of x.")
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"math/expm1", janet_expm1,
|
"math/expm1", janet_expm1,
|
||||||
JDOC("(math/expm1 x)\n\n"
|
JDOC("(math/expm1 x)\n\n"
|
||||||
@@ -478,11 +453,6 @@ static const JanetReg math_cfuns[] = {
|
|||||||
JDOC("(math/round x)\n\n"
|
JDOC("(math/round x)\n\n"
|
||||||
"Returns the integer nearest to x.")
|
"Returns the integer nearest to x.")
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"math/next", janet_nextafter,
|
|
||||||
JDOC("(math/next y)\n\n"
|
|
||||||
"Returns the next representable floating point value after x in the direction of y.")
|
|
||||||
},
|
|
||||||
{NULL, NULL, NULL}
|
{NULL, NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
222
src/core/os.c
222
src/core/os.c
@@ -880,23 +880,40 @@ static Janet os_readlink(int32_t argc, Janet *argv) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef JANET_WINDOWS
|
#ifdef JANET_WINDOWS
|
||||||
|
static const uint8_t *janet_decode_permissions(unsigned short m) {
|
||||||
typedef struct _stat jstat_t;
|
uint8_t flags[9] = {0};
|
||||||
typedef unsigned short jmode_t;
|
flags[0] = flags[3] = flags[6] = (m & S_IREAD) ? 'r' : '-';
|
||||||
|
flags[1] = flags[4] = flags[7] = (m & S_IWRITE) ? 'w' : '-';
|
||||||
static int32_t janet_perm_to_unix(unsigned short m) {
|
flags[2] = flags[5] = flags[8] = (m & S_IEXEC) ? 'x' : '-';
|
||||||
int32_t ret = 0;
|
return janet_string(flags, sizeof(flags));
|
||||||
if (m & S_IEXEC) ret |= 0111;
|
|
||||||
if (m & S_IWRITE) ret |= 0222;
|
|
||||||
if (m & S_IREAD) ret |= 0444;
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned short janet_perm_from_unix(int32_t x) {
|
static unsigned short janet_encode_permissions(Janet *argv, int32_t n) {
|
||||||
|
if (janet_checkint(argv[n])) {
|
||||||
|
int32_t x = janet_unwrap_integer(argv[n]);
|
||||||
|
if (x < 0 || x > 0777) {
|
||||||
|
janet_panicf("expected integer in range [0, 8r777], got %v", argv[n]);
|
||||||
|
}
|
||||||
unsigned short m = 0;
|
unsigned short m = 0;
|
||||||
if (x & 111) m |= S_IEXEC;
|
if (x & 1 || x & 010 || x & 0100) m |= S_IEXEC;
|
||||||
if (x & 222) m |= S_IWRITE;
|
if (x & 2 || x & 020 || x & 0200) m |= S_IWRITE;
|
||||||
if (x & 444) m |= S_IREAD;
|
if (x & 4 || x & 040 || x & 0400) m |= S_IREAD;
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
JanetString perm = janet_getstring(argv, n);
|
||||||
|
if (janet_string_length(perm) != 9) {
|
||||||
|
janet_panicf("expected string of length 9, got %S", perm);
|
||||||
|
}
|
||||||
|
unsigned short m = 0;
|
||||||
|
if (perm[0] == 'r') m |= S_IREAD;
|
||||||
|
if (perm[1] == 'w') m |= S_IWRITE;
|
||||||
|
if (perm[2] == 'x') m |= S_IEXEC;
|
||||||
|
if (perm[3] == 'r') m |= S_IREAD;
|
||||||
|
if (perm[4] == 'w') m |= S_IWRITE;
|
||||||
|
if (perm[5] == 'x') m |= S_IEXEC;
|
||||||
|
if (perm[6] == 'r') m |= S_IREAD;
|
||||||
|
if (perm[7] == 'w') m |= S_IWRITE;
|
||||||
|
if (perm[8] == 'x') m |= S_IEXEC;
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -907,23 +924,45 @@ static const uint8_t *janet_decode_mode(unsigned short m) {
|
|||||||
else if (m & _S_IFCHR) str = "character";
|
else if (m & _S_IFCHR) str = "character";
|
||||||
return janet_ckeyword(str);
|
return janet_ckeyword(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t janet_decode_permissions(jmode_t mode) {
|
|
||||||
return (int32_t)(mode & (S_IEXEC | S_IWRITE | S_IREAD));
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
static const uint8_t *janet_decode_permissions(mode_t m) {
|
||||||
typedef struct stat jstat_t;
|
uint8_t flags[9] = {0};
|
||||||
typedef mode_t jmode_t;
|
flags[0] = (m & S_IRUSR) ? 'r' : '-';
|
||||||
|
flags[1] = (m & S_IWUSR) ? 'w' : '-';
|
||||||
static int32_t janet_perm_to_unix(mode_t m) {
|
flags[2] = (m & S_IXUSR) ? 'x' : '-';
|
||||||
return (int32_t) m;
|
flags[3] = (m & S_IRGRP) ? 'r' : '-';
|
||||||
|
flags[4] = (m & S_IWGRP) ? 'w' : '-';
|
||||||
|
flags[5] = (m & S_IXGRP) ? 'x' : '-';
|
||||||
|
flags[6] = (m & S_IROTH) ? 'r' : '-';
|
||||||
|
flags[7] = (m & S_IWOTH) ? 'w' : '-';
|
||||||
|
flags[8] = (m & S_IXOTH) ? 'x' : '-';
|
||||||
|
return janet_string(flags, sizeof(flags));
|
||||||
}
|
}
|
||||||
|
|
||||||
static mode_t janet_perm_from_unix(int32_t x) {
|
static mode_t janet_encode_permissions(Janet *argv, int32_t n) {
|
||||||
|
if (janet_checkint(argv[n])) {
|
||||||
|
int32_t x = janet_unwrap_integer(argv[n]);
|
||||||
|
if (x < 0 || x > 0777) {
|
||||||
|
janet_panicf("expected integer in range [0, 8r777], got %v", argv[n]);
|
||||||
|
}
|
||||||
return (mode_t) x;
|
return (mode_t) x;
|
||||||
}
|
}
|
||||||
|
JanetString perm = janet_getstring(argv, n);
|
||||||
|
if (janet_string_length(perm) != 9) {
|
||||||
|
janet_panicf("expected string of length 9, got %S", perm);
|
||||||
|
}
|
||||||
|
mode_t m = 0;
|
||||||
|
if (perm[0] == 'r') m |= S_IRUSR;
|
||||||
|
if (perm[1] == 'w') m |= S_IWUSR;
|
||||||
|
if (perm[2] == 'x') m |= S_IXUSR;
|
||||||
|
if (perm[3] == 'r') m |= S_IRGRP;
|
||||||
|
if (perm[4] == 'w') m |= S_IWGRP;
|
||||||
|
if (perm[5] == 'x') m |= S_IXGRP;
|
||||||
|
if (perm[6] == 'r') m |= S_IROTH;
|
||||||
|
if (perm[7] == 'w') m |= S_IWOTH;
|
||||||
|
if (perm[8] == 'x') m |= S_IXOTH;
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
static const uint8_t *janet_decode_mode(mode_t m) {
|
static const uint8_t *janet_decode_mode(mode_t m) {
|
||||||
const char *str = "other";
|
const char *str = "other";
|
||||||
@@ -936,64 +975,13 @@ static const uint8_t *janet_decode_mode(mode_t m) {
|
|||||||
else if (S_ISCHR(m)) str = "character";
|
else if (S_ISCHR(m)) str = "character";
|
||||||
return janet_ckeyword(str);
|
return janet_ckeyword(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t janet_decode_permissions(jmode_t mode) {
|
|
||||||
return (int32_t)(mode & 0777);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int32_t os_parse_permstring(const uint8_t *perm) {
|
#ifdef JANET_WINDOWS
|
||||||
int32_t m = 0;
|
typedef struct _stat jstat_t;
|
||||||
if (perm[0] == 'r') m |= 0400;
|
#else
|
||||||
if (perm[1] == 'w') m |= 0200;
|
typedef struct stat jstat_t;
|
||||||
if (perm[2] == 'x') m |= 0100;
|
#endif
|
||||||
if (perm[3] == 'r') m |= 0040;
|
|
||||||
if (perm[4] == 'w') m |= 0020;
|
|
||||||
if (perm[5] == 'x') m |= 0010;
|
|
||||||
if (perm[6] == 'r') m |= 0004;
|
|
||||||
if (perm[7] == 'w') m |= 0002;
|
|
||||||
if (perm[8] == 'x') m |= 0001;
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Janet os_make_permstring(int32_t permissions) {
|
|
||||||
uint8_t bytes[9] = {0};
|
|
||||||
bytes[0] = (permissions & 0400) ? 'r' : '-';
|
|
||||||
bytes[1] = (permissions & 0200) ? 'w' : '-';
|
|
||||||
bytes[2] = (permissions & 0100) ? 'x' : '-';
|
|
||||||
bytes[3] = (permissions & 0040) ? 'r' : '-';
|
|
||||||
bytes[4] = (permissions & 0020) ? 'w' : '-';
|
|
||||||
bytes[5] = (permissions & 0010) ? 'x' : '-';
|
|
||||||
bytes[6] = (permissions & 0004) ? 'r' : '-';
|
|
||||||
bytes[7] = (permissions & 0002) ? 'w' : '-';
|
|
||||||
bytes[8] = (permissions & 0001) ? 'x' : '-';
|
|
||||||
return janet_stringv(bytes, sizeof(bytes));
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t os_get_unix_mode(const Janet *argv, int32_t n) {
|
|
||||||
int32_t unix_mode;
|
|
||||||
if (janet_checkint(argv[n])) {
|
|
||||||
/* Integer mode */
|
|
||||||
int32_t x = janet_unwrap_integer(argv[n]);
|
|
||||||
if (x < 0 || x > 0777) {
|
|
||||||
janet_panicf("bad slot #%d, expected integer in range [0, 8r777], got %v", n, argv[n]);
|
|
||||||
}
|
|
||||||
unix_mode = x;
|
|
||||||
} else {
|
|
||||||
/* Bytes mode */
|
|
||||||
JanetByteView bytes = janet_getbytes(argv, n);
|
|
||||||
if (bytes.len != 9) {
|
|
||||||
janet_panicf("bad slot #%d: expected byte sequence of length 9, got %v", n, argv[n]);
|
|
||||||
}
|
|
||||||
unix_mode = os_parse_permstring(bytes.bytes);
|
|
||||||
}
|
|
||||||
return unix_mode;
|
|
||||||
}
|
|
||||||
|
|
||||||
static jmode_t os_getmode(const Janet *argv, int32_t n) {
|
|
||||||
return janet_perm_from_unix(os_get_unix_mode(argv, n));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Getters */
|
/* Getters */
|
||||||
static Janet os_stat_dev(jstat_t *st) {
|
static Janet os_stat_dev(jstat_t *st) {
|
||||||
@@ -1005,11 +993,8 @@ static Janet os_stat_inode(jstat_t *st) {
|
|||||||
static Janet os_stat_mode(jstat_t *st) {
|
static Janet os_stat_mode(jstat_t *st) {
|
||||||
return janet_wrap_keyword(janet_decode_mode(st->st_mode));
|
return janet_wrap_keyword(janet_decode_mode(st->st_mode));
|
||||||
}
|
}
|
||||||
static Janet os_stat_int_permissions(jstat_t *st) {
|
|
||||||
return janet_wrap_integer(janet_perm_to_unix(janet_decode_permissions(st->st_mode)));
|
|
||||||
}
|
|
||||||
static Janet os_stat_permissions(jstat_t *st) {
|
static Janet os_stat_permissions(jstat_t *st) {
|
||||||
return os_make_permstring(janet_perm_to_unix(janet_decode_permissions(st->st_mode)));
|
return janet_wrap_string(janet_decode_permissions(st->st_mode));
|
||||||
}
|
}
|
||||||
static Janet os_stat_uid(jstat_t *st) {
|
static Janet os_stat_uid(jstat_t *st) {
|
||||||
return janet_wrap_number(st->st_uid);
|
return janet_wrap_number(st->st_uid);
|
||||||
@@ -1060,7 +1045,6 @@ static const struct OsStatGetter os_stat_getters[] = {
|
|||||||
{"dev", os_stat_dev},
|
{"dev", os_stat_dev},
|
||||||
{"inode", os_stat_inode},
|
{"inode", os_stat_inode},
|
||||||
{"mode", os_stat_mode},
|
{"mode", os_stat_mode},
|
||||||
{"octal-permissions", os_stat_int_permissions},
|
|
||||||
{"permissions", os_stat_permissions},
|
{"permissions", os_stat_permissions},
|
||||||
{"uid", os_stat_uid},
|
{"uid", os_stat_uid},
|
||||||
{"gid", os_stat_gid},
|
{"gid", os_stat_gid},
|
||||||
@@ -1138,25 +1122,14 @@ static Janet os_chmod(int32_t argc, Janet *argv) {
|
|||||||
janet_fixarity(argc, 2);
|
janet_fixarity(argc, 2);
|
||||||
const char *path = janet_getcstring(argv, 0);
|
const char *path = janet_getcstring(argv, 0);
|
||||||
#ifdef JANET_WINDOWS
|
#ifdef JANET_WINDOWS
|
||||||
int res = _chmod(path, os_getmode(argv, 1));
|
int res = _chmod(path, janet_encode_permissions(argv, 1));
|
||||||
#else
|
#else
|
||||||
int res = chmod(path, os_getmode(argv, 1));
|
int res = chmod(path, janet_encode_permissions(argv, 1));
|
||||||
#endif
|
#endif
|
||||||
if (-1 == res) janet_panicf("%s: %s", strerror(errno), path);
|
if (-1 == res) janet_panicf("%s: %s", strerror(errno), path);
|
||||||
return janet_wrap_nil();
|
return janet_wrap_nil();
|
||||||
}
|
}
|
||||||
|
|
||||||
static Janet os_umask(int32_t argc, Janet *argv) {
|
|
||||||
janet_fixarity(argc, 1);
|
|
||||||
int mask = (int) os_getmode(argv, 0);
|
|
||||||
#ifdef JANET_WINDOWS
|
|
||||||
int res = _umask(mask);
|
|
||||||
#else
|
|
||||||
int res = umask(mask);
|
|
||||||
#endif
|
|
||||||
return janet_wrap_integer(janet_perm_to_unix(res));
|
|
||||||
}
|
|
||||||
|
|
||||||
static Janet os_dir(int32_t argc, Janet *argv) {
|
static Janet os_dir(int32_t argc, Janet *argv) {
|
||||||
janet_arity(argc, 1, 2);
|
janet_arity(argc, 1, 2);
|
||||||
const char *dir = janet_getcstring(argv, 0);
|
const char *dir = janet_getcstring(argv, 0);
|
||||||
@@ -1218,16 +1191,6 @@ static Janet os_realpath(int32_t argc, Janet *argv) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static Janet os_permission_string(int32_t argc, Janet *argv) {
|
|
||||||
janet_fixarity(argc, 1);
|
|
||||||
return os_make_permstring(os_get_unix_mode(argv, 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
static Janet os_permission_int(int32_t argc, Janet *argv) {
|
|
||||||
janet_fixarity(argc, 1);
|
|
||||||
return janet_wrap_integer(os_get_unix_mode(argv, 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* JANET_REDUCED_OS */
|
#endif /* JANET_REDUCED_OS */
|
||||||
|
|
||||||
static const JanetReg os_cfuns[] = {
|
static const JanetReg os_cfuns[] = {
|
||||||
@@ -1286,8 +1249,7 @@ static const JanetReg os_cfuns[] = {
|
|||||||
" only that information from stat. If the file or directory does not exist, returns nil. The keys are\n\n"
|
" only that information from stat. If the file or directory does not exist, returns nil. The keys are\n\n"
|
||||||
"\t:dev - the device that the file is on\n"
|
"\t:dev - the device that the file is on\n"
|
||||||
"\t:mode - the type of file, one of :file, :directory, :block, :character, :fifo, :socket, :link, or :other\n"
|
"\t:mode - the type of file, one of :file, :directory, :block, :character, :fifo, :socket, :link, or :other\n"
|
||||||
"\t:octal-permissions - A Unix permission integer like 8r744\n"
|
"\t:permissions - A unix permission string like \"rwx--x--x\". On windows, a string like \"rwx\".\n"
|
||||||
"\t:permissions - A Unix permission string like \"rwxr--r--\"\n"
|
|
||||||
"\t:uid - File uid\n"
|
"\t:uid - File uid\n"
|
||||||
"\t:gid - File gid\n"
|
"\t:gid - File gid\n"
|
||||||
"\t:nlink - number of links to file\n"
|
"\t:nlink - number of links to file\n"
|
||||||
@@ -1308,9 +1270,9 @@ static const JanetReg os_cfuns[] = {
|
|||||||
"os/chmod", os_chmod,
|
"os/chmod", os_chmod,
|
||||||
JDOC("(os/chmod path mode)\n\n"
|
JDOC("(os/chmod path mode)\n\n"
|
||||||
"Change file permissions, where mode is a permission string as returned by "
|
"Change file permissions, where mode is a permission string as returned by "
|
||||||
"os/perm-string, or an integer as returned by os/perm-int. "
|
"os/stat, or an integer. "
|
||||||
"When mode is an integer, it is interpreted as a Unix permission value, best specified in octal, like "
|
"When mode is an integer, it is interpreted as a unix permission value, best specified in octal, like "
|
||||||
"8r666 or 8r400. Windows will not differentiate between user, group, and other permissions, and thus will combine all of these permissions. Returns nil.")
|
"8r666 or 8r400. Windows will not differentiate between user, group, and other permissions. Returns nil.")
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"os/touch", os_touch,
|
"os/touch", os_touch,
|
||||||
@@ -1323,16 +1285,11 @@ static const JanetReg os_cfuns[] = {
|
|||||||
JDOC("(os/cd path)\n\n"
|
JDOC("(os/cd path)\n\n"
|
||||||
"Change current directory to path. Returns nil on success, errors on failure.")
|
"Change current directory to path. Returns nil on success, errors on failure.")
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"os/umask", os_umask,
|
|
||||||
JDOC("(os/umask mask)\n\n"
|
|
||||||
"Set a new umask, returns the old umask.")
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"os/mkdir", os_mkdir,
|
"os/mkdir", os_mkdir,
|
||||||
JDOC("(os/mkdir path)\n\n"
|
JDOC("(os/mkdir path)\n\n"
|
||||||
"Create a new directory. The path will be relative to the current directory if relative, otherwise "
|
"Create a new directory. The path will be relative to the current directory if relative, otherwise "
|
||||||
"it will be an absolute path. Returns true if the directory was created, false if the directory already exists, and "
|
"it will be an absolute path. Returns true if the directory was create, false if the directoyr already exists, and "
|
||||||
"errors otherwise.")
|
"errors otherwise.")
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1348,10 +1305,8 @@ static const JanetReg os_cfuns[] = {
|
|||||||
{
|
{
|
||||||
"os/link", os_link,
|
"os/link", os_link,
|
||||||
JDOC("(os/link oldpath newpath &opt symlink)\n\n"
|
JDOC("(os/link oldpath newpath &opt symlink)\n\n"
|
||||||
"Create a link at newpath that points to oldpath and returns nil. "
|
"Create a symlink from oldpath to newpath, returning nil. The 3rd optional paramater "
|
||||||
"Iff symlink is truthy, creates a symlink. "
|
"enables a symlink iff truthy, hard link otherwise or if not provided. Does not work on Windows.")
|
||||||
"Iff symlink is falsey or not provided, "
|
|
||||||
"creates a hard link. Does not work on Windows.")
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"os/symlink", os_symlink,
|
"os/symlink", os_symlink,
|
||||||
@@ -1421,14 +1376,14 @@ static const JanetReg os_cfuns[] = {
|
|||||||
{
|
{
|
||||||
"os/cryptorand", os_cryptorand,
|
"os/cryptorand", os_cryptorand,
|
||||||
JDOC("(os/cryptorand n &opt buf)\n\n"
|
JDOC("(os/cryptorand n &opt buf)\n\n"
|
||||||
"Get or append n bytes of good quality random data provided by the OS. Returns a new buffer or buf.")
|
"Get or append n bytes of good quality random data provided by the os. Returns a new buffer or buf.")
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"os/date", os_date,
|
"os/date", os_date,
|
||||||
JDOC("(os/date &opt time local)\n\n"
|
JDOC("(os/date &opt time local)\n\n"
|
||||||
"Returns the given time as a date struct, or the current time if no time is given. "
|
"Returns the given time as a date struct, or the current time if no time is given. "
|
||||||
"Returns a struct with following key values. Note that all numbers are 0-indexed. "
|
"Returns a struct with following key values. Note that all numbers are 0-indexed. "
|
||||||
"Date is given in UTC unless local is truthy, in which case the date is formatted for "
|
"Date is given in UTC unless local is truthy, in which case the date is formated for "
|
||||||
"the local timezone.\n\n"
|
"the local timezone.\n\n"
|
||||||
"\t:seconds - number of seconds [0-61]\n"
|
"\t:seconds - number of seconds [0-61]\n"
|
||||||
"\t:minutes - number of minutes [0-59]\n"
|
"\t:minutes - number of minutes [0-59]\n"
|
||||||
@@ -1451,19 +1406,6 @@ static const JanetReg os_cfuns[] = {
|
|||||||
"Get the absolute path for a given path, following ../, ./, and symlinks. "
|
"Get the absolute path for a given path, following ../, ./, and symlinks. "
|
||||||
"Returns an absolute path as a string. Will raise an error on Windows.")
|
"Returns an absolute path as a string. Will raise an error on Windows.")
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"os/perm-string", os_permission_string,
|
|
||||||
JDOC("(os/perm-string int)\n\n"
|
|
||||||
"Convert a Unix octal permission value from a permission integer as returned by os/stat "
|
|
||||||
"to a human readable string, that follows the formatting "
|
|
||||||
"of unix tools like ls. Returns the string as a 9 character string of r, w, x and - characters. Does not "
|
|
||||||
"include the file/directory/symlink character as rendered by `ls`.")
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"os/perm-int", os_permission_int,
|
|
||||||
JDOC("(os/perm-int bytes)\n\n"
|
|
||||||
"Parse a 9 character permission string and return an integer that can be used by chmod.")
|
|
||||||
},
|
|
||||||
#endif
|
#endif
|
||||||
{NULL, NULL, NULL}
|
{NULL, NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -112,6 +112,8 @@ struct JanetParseState {
|
|||||||
Consumer consumer;
|
Consumer consumer;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int root(JanetParser *p, JanetParseState *state, uint8_t c);
|
||||||
|
|
||||||
/* Define a stack on the main parser struct */
|
/* Define a stack on the main parser struct */
|
||||||
#define DEF_PARSER_STACK(NAME, T, STACK, STACKCOUNT, STACKCAP) \
|
#define DEF_PARSER_STACK(NAME, T, STACK, STACKCOUNT, STACKCAP) \
|
||||||
static void NAME(JanetParser *p, T x) { \
|
static void NAME(JanetParser *p, T x) { \
|
||||||
@@ -183,8 +185,12 @@ static void popstate(JanetParser *p, Janet val) {
|
|||||||
(c == ',') ? "unquote" :
|
(c == ',') ? "unquote" :
|
||||||
(c == ';') ? "splice" :
|
(c == ';') ? "splice" :
|
||||||
(c == '|') ? "short-fn" :
|
(c == '|') ? "short-fn" :
|
||||||
(c == '~') ? "quasiquote" : "<unknown>";
|
(c == '~') ? "quasiquote" : NULL;
|
||||||
|
if (!which) {
|
||||||
|
t[0] = p->args[--p->argcount];
|
||||||
|
} else {
|
||||||
t[0] = janet_csymbolv(which);
|
t[0] = janet_csymbolv(which);
|
||||||
|
}
|
||||||
t[1] = val;
|
t[1] = val;
|
||||||
/* Quote source mapping info */
|
/* Quote source mapping info */
|
||||||
janet_tuple_sm_line(t) = (int32_t) newtop->line;
|
janet_tuple_sm_line(t) = (int32_t) newtop->line;
|
||||||
@@ -320,6 +326,7 @@ static int tokenchar(JanetParser *p, JanetParseState *state, uint8_t c) {
|
|||||||
Janet ret;
|
Janet ret;
|
||||||
double numval;
|
double numval;
|
||||||
int32_t blen;
|
int32_t blen;
|
||||||
|
int prefix_symbol = 0;
|
||||||
if (is_symbol_char(c)) {
|
if (is_symbol_char(c)) {
|
||||||
push_buf(p, (uint8_t) c);
|
push_buf(p, (uint8_t) c);
|
||||||
if (c > 127) state->argn = 1; /* Use to indicate non ascii */
|
if (c > 127) state->argn = 1; /* Use to indicate non ascii */
|
||||||
@@ -357,10 +364,20 @@ static int tokenchar(JanetParser *p, JanetParseState *state, uint8_t c) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
ret = janet_symbolv(p->buf, blen);
|
ret = janet_symbolv(p->buf, blen);
|
||||||
|
prefix_symbol = c == '"' || c == '`' || c == '[' || c == '(' || c == '{';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
p->bufcount = 0;
|
p->bufcount = 0;
|
||||||
|
if (prefix_symbol) {
|
||||||
|
push_arg(p, ret);
|
||||||
|
/* Set current state to a different state */
|
||||||
|
JanetParseState newState = {0};
|
||||||
|
newState.flags = PFLAG_READERMAC;
|
||||||
|
newState.consumer = root;
|
||||||
|
*state = newState;
|
||||||
|
} else {
|
||||||
popstate(p, ret);
|
popstate(p, ret);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -455,8 +472,6 @@ static int longstring(JanetParser *p, JanetParseState *state, uint8_t c) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int root(JanetParser *p, JanetParseState *state, uint8_t c);
|
|
||||||
|
|
||||||
static int atsign(JanetParser *p, JanetParseState *state, uint8_t c) {
|
static int atsign(JanetParser *p, JanetParseState *state, uint8_t c) {
|
||||||
(void) state;
|
(void) state;
|
||||||
p->statecount--;
|
p->statecount--;
|
||||||
@@ -927,6 +942,7 @@ static Janet janet_wrap_parse_state(JanetParseState *s, Janet *args,
|
|||||||
type = (c == '\'') ? "quote" :
|
type = (c == '\'') ? "quote" :
|
||||||
(c == ',') ? "unquote" :
|
(c == ',') ? "unquote" :
|
||||||
(c == ';') ? "splice" :
|
(c == ';') ? "splice" :
|
||||||
|
(c == '|') ? "short-fn" :
|
||||||
(c == '~') ? "quasiquote" : "<reader>";
|
(c == '~') ? "quasiquote" : "<reader>";
|
||||||
} else {
|
} else {
|
||||||
type = "root";
|
type = "root";
|
||||||
|
|||||||
@@ -8,8 +8,7 @@
|
|||||||
|
|
||||||
(defn assert
|
(defn assert
|
||||||
"Override's the default assert with some nice error handling."
|
"Override's the default assert with some nice error handling."
|
||||||
[x &opt e]
|
[x e]
|
||||||
(default e "assert error")
|
|
||||||
(++ num-tests-run)
|
(++ num-tests-run)
|
||||||
(when x (++ num-tests-passed))
|
(when x (++ num-tests-passed))
|
||||||
(if x
|
(if x
|
||||||
|
|||||||
@@ -194,18 +194,4 @@
|
|||||||
(assert (deep= @[] (accumulate2 + [])) "accumulate2 2")
|
(assert (deep= @[] (accumulate2 + [])) "accumulate2 2")
|
||||||
(assert (deep= @[] (accumulate 0 + [])) "accumulate 2")
|
(assert (deep= @[] (accumulate 0 + [])) "accumulate 2")
|
||||||
|
|
||||||
# Perm strings
|
|
||||||
|
|
||||||
(assert (= (os/perm-int "rwxrwxrwx") 8r777) "perm 1")
|
|
||||||
(assert (= (os/perm-int "rwxr-xr-x") 8r755) "perm 2")
|
|
||||||
(assert (= (os/perm-int "rw-r--r--") 8r644) "perm 3")
|
|
||||||
|
|
||||||
(assert (= (band (os/perm-int "rwxrwxrwx") 8r077) 8r077) "perm 4")
|
|
||||||
(assert (= (band (os/perm-int "rwxr-xr-x") 8r077) 8r055) "perm 5")
|
|
||||||
(assert (= (band (os/perm-int "rw-r--r--") 8r077) 8r044) "perm 6")
|
|
||||||
|
|
||||||
(assert (= (os/perm-string 8r777) "rwxrwxrwx") "perm 7")
|
|
||||||
(assert (= (os/perm-string 8r755) "rwxr-xr-x") "perm 8")
|
|
||||||
(assert (= (os/perm-string 8r644) "rw-r--r--") "perm 9")
|
|
||||||
|
|
||||||
(end-suite)
|
(end-suite)
|
||||||
|
|||||||
Reference in New Issue
Block a user