Update Files
This commit is contained in:
85
Kha/Tools/linux_arm64/std/lua/_std/haxe/Exception.hx
Normal file
85
Kha/Tools/linux_arm64/std/lua/_std/haxe/Exception.hx
Normal file
@ -0,0 +1,85 @@
|
||||
package haxe;
|
||||
|
||||
@:coreApi
|
||||
class Exception {
|
||||
public var message(get,never):String;
|
||||
public var stack(get,never):CallStack;
|
||||
public var previous(get,never):Null<Exception>;
|
||||
public var native(get,never):Any;
|
||||
|
||||
@:noCompletion var __exceptionMessage:String;
|
||||
@:noCompletion var __exceptionStack:Null<CallStack>;
|
||||
@:noCompletion var __nativeStack:Array<String>;
|
||||
@:noCompletion @:ifFeature("haxe.Exception.get_stack") var __skipStack:Int = 0;
|
||||
@:noCompletion var __nativeException:Any;
|
||||
@:noCompletion var __previousException:Null<Exception>;
|
||||
|
||||
static function caught(value:Any):Exception {
|
||||
if(Std.isOfType(value, Exception)) {
|
||||
return value;
|
||||
} else {
|
||||
return new ValueException(value, null, value);
|
||||
}
|
||||
}
|
||||
|
||||
static function thrown(value:Any):Any {
|
||||
if(Std.isOfType(value, Exception)) {
|
||||
return (value:Exception).native;
|
||||
} else {
|
||||
var e = new ValueException(value);
|
||||
e.__shiftStack();
|
||||
return e;
|
||||
}
|
||||
}
|
||||
|
||||
public function new(message:String, ?previous:Exception, ?native:Any) {
|
||||
__exceptionMessage = message;
|
||||
__previousException = previous;
|
||||
if(native != null) {
|
||||
__nativeException = native;
|
||||
__nativeStack = NativeStackTrace.exceptionStack();
|
||||
} else {
|
||||
__nativeException = this;
|
||||
__nativeStack = NativeStackTrace.callStack();
|
||||
__skipStack = 1;
|
||||
}
|
||||
}
|
||||
|
||||
function unwrap():Any {
|
||||
return __nativeException;
|
||||
}
|
||||
|
||||
public function toString():String {
|
||||
return message;
|
||||
}
|
||||
|
||||
public function details():String {
|
||||
return inline CallStack.exceptionToString(this);
|
||||
}
|
||||
|
||||
@:noCompletion
|
||||
@:ifFeature("haxe.Exception.get_stack")
|
||||
inline function __shiftStack():Void {
|
||||
__skipStack++;
|
||||
}
|
||||
|
||||
function get_message():String {
|
||||
return __exceptionMessage;
|
||||
}
|
||||
|
||||
function get_previous():Null<Exception> {
|
||||
return __previousException;
|
||||
}
|
||||
|
||||
final function get_native():Any {
|
||||
return __nativeException;
|
||||
}
|
||||
|
||||
function get_stack():CallStack {
|
||||
return switch __exceptionStack {
|
||||
case null:
|
||||
__exceptionStack = NativeStackTrace.toHaxe(__nativeStack, __skipStack);
|
||||
case s: s;
|
||||
}
|
||||
}
|
||||
}
|
34
Kha/Tools/linux_arm64/std/lua/_std/haxe/Json.hx
Normal file
34
Kha/Tools/linux_arm64/std/lua/_std/haxe/Json.hx
Normal file
@ -0,0 +1,34 @@
|
||||
/*
|
||||
* Copyright (C)2005-2019 Haxe Foundation
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package haxe;
|
||||
|
||||
@:coreApi
|
||||
class Json {
|
||||
public static function parse(text:String):Dynamic {
|
||||
return haxe.format.JsonParser.parse(text);
|
||||
}
|
||||
|
||||
public static function stringify(value:Dynamic, ?replacer:(key:Dynamic, value:Dynamic) -> Dynamic, ?space:String):String {
|
||||
return haxe.format.JsonPrinter.print(value, replacer, space);
|
||||
}
|
||||
}
|
54
Kha/Tools/linux_arm64/std/lua/_std/haxe/NativeStackTrace.hx
Normal file
54
Kha/Tools/linux_arm64/std/lua/_std/haxe/NativeStackTrace.hx
Normal file
@ -0,0 +1,54 @@
|
||||
package haxe;
|
||||
|
||||
import haxe.CallStack.StackItem;
|
||||
|
||||
/**
|
||||
Do not use manually.
|
||||
**/
|
||||
@:dox(hide)
|
||||
@:noCompletion
|
||||
class NativeStackTrace {
|
||||
@:ifFeature('haxe.NativeStackTrace.exceptionStack')
|
||||
static public inline function saveStack(exception:Any):Void {
|
||||
}
|
||||
|
||||
static public function callStack():Array<String> {
|
||||
return switch lua.Debug.traceback() {
|
||||
case null: [];
|
||||
case s: s.split('\n').slice(3);
|
||||
}
|
||||
}
|
||||
|
||||
static public function exceptionStack():Array<String> {
|
||||
return []; //Not implemented. Maybe try xpcal instead of pcal in genlua.
|
||||
}
|
||||
|
||||
static public function toHaxe(native:Array<String>, skip:Int = 0):Array<StackItem> {
|
||||
var stack = [];
|
||||
var cnt = -1;
|
||||
for (item in native) {
|
||||
var parts = item.substr(1).split(":"); //`substr` to skip a tab at the beginning of a line
|
||||
var file = parts[0];
|
||||
if(file == '[C]') {
|
||||
continue;
|
||||
}
|
||||
++cnt;
|
||||
if(skip > cnt) {
|
||||
continue;
|
||||
}
|
||||
var line = parts[1];
|
||||
var method = if(parts.length <= 2) {
|
||||
null;
|
||||
} else {
|
||||
var methodPos = parts[2].indexOf("'");
|
||||
if(methodPos < 0) {
|
||||
null;
|
||||
} else {
|
||||
Method(null, parts[2].substring(methodPos + 1, parts[2].length - 1));
|
||||
}
|
||||
}
|
||||
stack.push(FilePos(method, file, Std.parseInt(line)));
|
||||
}
|
||||
return stack;
|
||||
}
|
||||
}
|
55
Kha/Tools/linux_arm64/std/lua/_std/haxe/Rest.hx
Normal file
55
Kha/Tools/linux_arm64/std/lua/_std/haxe/Rest.hx
Normal file
@ -0,0 +1,55 @@
|
||||
package haxe;
|
||||
|
||||
import lua.Lua.select;
|
||||
import lua.Table;
|
||||
import lua.PairTools.copy;
|
||||
import lua.TableTools.maxn;
|
||||
import lua.TableTools.pack;
|
||||
import lua.TableTools.unpack;
|
||||
import haxe.iterators.RestIterator;
|
||||
import haxe.iterators.RestKeyValueIterator;
|
||||
|
||||
private typedef NativeRest<T> = Table<Int,T>;
|
||||
|
||||
@:coreApi
|
||||
abstract Rest<T>(NativeRest<T>) {
|
||||
public var length(get, never):Int;
|
||||
inline function get_length():Int
|
||||
return maxn(this);
|
||||
|
||||
@:from static public function of<T>(array:Array<T>):Rest<T> {
|
||||
return new Rest(Table.fromArray(array));
|
||||
}
|
||||
|
||||
inline function new(table:Table<Int,T>):Void
|
||||
this = table;
|
||||
|
||||
@:arrayAccess inline function get(index:Int):T
|
||||
return this[index + 1];
|
||||
|
||||
@:to public function toArray():Array<T> {
|
||||
return Table.toArray(this);
|
||||
}
|
||||
|
||||
public inline function iterator():RestIterator<T>
|
||||
return new RestIterator<T>(this);
|
||||
|
||||
public inline function keyValueIterator():RestKeyValueIterator<T>
|
||||
return new RestKeyValueIterator<T>(this);
|
||||
|
||||
public inline function append(item:T):Rest<T> {
|
||||
var result = copy(this);
|
||||
Table.insert(result, item);
|
||||
return new Rest(result);
|
||||
}
|
||||
|
||||
public inline function prepend(item:T):Rest<T> {
|
||||
var result = copy(this);
|
||||
Table.insert(result, 1, item);
|
||||
return new Rest(result);
|
||||
}
|
||||
|
||||
public function toString():String {
|
||||
return toArray().toString();
|
||||
}
|
||||
}
|
115
Kha/Tools/linux_arm64/std/lua/_std/haxe/ds/IntMap.hx
Normal file
115
Kha/Tools/linux_arm64/std/lua/_std/haxe/ds/IntMap.hx
Normal file
@ -0,0 +1,115 @@
|
||||
/*
|
||||
* Copyright (C)2005-2019 Haxe Foundation
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package haxe.ds;
|
||||
|
||||
import lua.Lua;
|
||||
|
||||
class IntMap<T> implements haxe.Constraints.IMap<Int, T> {
|
||||
private var h:lua.Table<Int, T>;
|
||||
|
||||
static var tnull:Dynamic = lua.Table.create();
|
||||
|
||||
public inline function new():Void {
|
||||
h = lua.Table.create();
|
||||
}
|
||||
|
||||
public inline function set(key:Int, value:T):Void {
|
||||
if (value == null) {
|
||||
h[key] = tnull;
|
||||
} else {
|
||||
h[key] = value;
|
||||
}
|
||||
}
|
||||
|
||||
public inline function get(key:Int):Null<T> {
|
||||
var ret = h[key];
|
||||
if (ret == tnull) {
|
||||
ret = null;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
public inline function exists(key:Int):Bool {
|
||||
return h[key] != null;
|
||||
}
|
||||
|
||||
public function remove(key:Int):Bool {
|
||||
if (h[key] == null) {
|
||||
return false;
|
||||
} else {
|
||||
h[key] = null;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public function keys():Iterator<Int> {
|
||||
var next = Lua.next;
|
||||
var cur = next(h, null).index;
|
||||
return {
|
||||
next: function() {
|
||||
var ret = cur;
|
||||
cur = next(h, cur).index;
|
||||
return cast ret;
|
||||
},
|
||||
hasNext: function() return cur != null
|
||||
}
|
||||
}
|
||||
|
||||
public function iterator():Iterator<T> {
|
||||
var it = keys();
|
||||
return untyped {
|
||||
hasNext: function() return it.hasNext(),
|
||||
next: function() return h[it.next()]
|
||||
};
|
||||
}
|
||||
|
||||
@:runtime public inline function keyValueIterator():KeyValueIterator<Int, T> {
|
||||
return new haxe.iterators.MapKeyValueIterator(this);
|
||||
}
|
||||
|
||||
public function copy():IntMap<T> {
|
||||
var copied = new IntMap();
|
||||
for (key in keys())
|
||||
copied.set(key, get(key));
|
||||
return copied;
|
||||
}
|
||||
|
||||
public function toString():String {
|
||||
var s = new StringBuf();
|
||||
s.add("{");
|
||||
var it = keys();
|
||||
for (i in it) {
|
||||
s.add(i);
|
||||
s.add(" => ");
|
||||
s.add(Std.string(get(i)));
|
||||
if (it.hasNext())
|
||||
s.add(", ");
|
||||
}
|
||||
s.add("}");
|
||||
return s.toString();
|
||||
}
|
||||
|
||||
public inline function clear():Void {
|
||||
h = lua.Table.create();
|
||||
}
|
||||
}
|
120
Kha/Tools/linux_arm64/std/lua/_std/haxe/ds/ObjectMap.hx
Normal file
120
Kha/Tools/linux_arm64/std/lua/_std/haxe/ds/ObjectMap.hx
Normal file
@ -0,0 +1,120 @@
|
||||
/*
|
||||
* Copyright (C)2005-2019 Haxe Foundation
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package haxe.ds;
|
||||
|
||||
class ObjectMap<A, B> implements haxe.Constraints.IMap<A, B> {
|
||||
static var count = 0;
|
||||
|
||||
static inline function assignId(obj:{}):Int {
|
||||
return untyped obj.__id__ = ++count;
|
||||
}
|
||||
|
||||
static inline function getId(obj:{}):Int {
|
||||
return untyped obj.__id__;
|
||||
}
|
||||
|
||||
var h:Dynamic;
|
||||
var k:Dynamic;
|
||||
|
||||
public inline function new():Void {
|
||||
h = lua.Table.create();
|
||||
k = lua.Table.create();
|
||||
}
|
||||
|
||||
public inline function set(key:A, value:B):Void
|
||||
untyped {
|
||||
h[key] = value;
|
||||
k[key] = true;
|
||||
}
|
||||
|
||||
public inline function get(key:A):Null<B>
|
||||
untyped {
|
||||
return h[key];
|
||||
}
|
||||
|
||||
public inline function exists(key:A):Bool
|
||||
untyped {
|
||||
return k[key] != null;
|
||||
}
|
||||
|
||||
public function remove(key:A):Bool
|
||||
untyped {
|
||||
if (k[key] == null)
|
||||
return false;
|
||||
k[key] = null;
|
||||
h[key] = null;
|
||||
return true;
|
||||
}
|
||||
|
||||
public function keys():Iterator<A>
|
||||
untyped {
|
||||
var cur = next(h, null);
|
||||
return {
|
||||
next: function() {
|
||||
var ret = cur;
|
||||
cur = untyped next(k, cur);
|
||||
return ret;
|
||||
},
|
||||
hasNext: function() return cur != null
|
||||
}
|
||||
}
|
||||
|
||||
public function iterator():Iterator<B> {
|
||||
var itr = keys();
|
||||
return untyped {
|
||||
hasNext: itr.hasNext,
|
||||
next: function() return h[itr.next()]
|
||||
};
|
||||
}
|
||||
|
||||
@:runtime public inline function keyValueIterator():KeyValueIterator<A, B> {
|
||||
return new haxe.iterators.MapKeyValueIterator(this);
|
||||
}
|
||||
|
||||
public function copy():ObjectMap<A, B> {
|
||||
var copied = new ObjectMap();
|
||||
for (key in keys())
|
||||
copied.set(key, get(key));
|
||||
return copied;
|
||||
}
|
||||
|
||||
public function toString():String {
|
||||
var s = new StringBuf();
|
||||
s.add("{");
|
||||
var it = keys();
|
||||
for (i in it) {
|
||||
s.add(i);
|
||||
s.add(" => ");
|
||||
s.add(Std.string(get(i)));
|
||||
if (it.hasNext())
|
||||
s.add(", ");
|
||||
}
|
||||
s.add("}");
|
||||
return s.toString();
|
||||
}
|
||||
|
||||
public inline function clear():Void {
|
||||
h = lua.Table.create();
|
||||
k = lua.Table.create();
|
||||
}
|
||||
}
|
119
Kha/Tools/linux_arm64/std/lua/_std/haxe/ds/StringMap.hx
Normal file
119
Kha/Tools/linux_arm64/std/lua/_std/haxe/ds/StringMap.hx
Normal file
@ -0,0 +1,119 @@
|
||||
/*
|
||||
* Copyright (C)2005-2019 Haxe Foundation
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package haxe.ds;
|
||||
|
||||
import lua.Lua;
|
||||
|
||||
class StringMap<T> implements haxe.Constraints.IMap<String, T> {
|
||||
private var h:lua.Table<String, T>;
|
||||
|
||||
static var tnull:Dynamic = lua.Table.create();
|
||||
|
||||
public inline function new():Void {
|
||||
h = lua.Table.create();
|
||||
}
|
||||
|
||||
public inline function set(key:String, value:T):Void
|
||||
untyped {
|
||||
if (value == null) {
|
||||
h[key] = tnull;
|
||||
} else {
|
||||
h[key] = value;
|
||||
}
|
||||
}
|
||||
|
||||
public inline function get(key:String):Null<T>
|
||||
untyped {
|
||||
var ret = h[key];
|
||||
if (ret == tnull) {
|
||||
ret = null;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
public inline function exists(key:String):Bool
|
||||
untyped {
|
||||
return h[key] != null;
|
||||
}
|
||||
|
||||
public function remove(key:String):Bool
|
||||
untyped {
|
||||
if (h[key] == null) {
|
||||
return false;
|
||||
} else {
|
||||
h[key] = null;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public function keys():Iterator<String> {
|
||||
var next = Lua.next;
|
||||
var cur = next(h, null).index;
|
||||
return {
|
||||
next: function() {
|
||||
var ret = cur;
|
||||
cur = next(h, cur).index;
|
||||
return cast ret;
|
||||
},
|
||||
hasNext: function() return cur != null
|
||||
}
|
||||
}
|
||||
|
||||
public function iterator():Iterator<T> {
|
||||
var it = keys();
|
||||
return untyped {
|
||||
hasNext: function() return it.hasNext(),
|
||||
next: function() return h[it.next()]
|
||||
};
|
||||
}
|
||||
|
||||
@:runtime public inline function keyValueIterator():KeyValueIterator<String, T> {
|
||||
return new haxe.iterators.MapKeyValueIterator(this);
|
||||
}
|
||||
|
||||
public function copy():StringMap<T> {
|
||||
var copied = new StringMap();
|
||||
for (key in keys())
|
||||
copied.set(key, get(key));
|
||||
return copied;
|
||||
}
|
||||
|
||||
public function toString():String {
|
||||
var s = new StringBuf();
|
||||
s.add("{");
|
||||
var it = keys();
|
||||
for (i in it) {
|
||||
s.add(i);
|
||||
s.add(" => ");
|
||||
s.add(Std.string(get(i)));
|
||||
if (it.hasNext())
|
||||
s.add(", ");
|
||||
}
|
||||
s.add("}");
|
||||
return s.toString();
|
||||
}
|
||||
|
||||
public inline function clear():Void {
|
||||
h = lua.Table.create();
|
||||
}
|
||||
}
|
292
Kha/Tools/linux_arm64/std/lua/_std/haxe/format/JsonParser.hx
Normal file
292
Kha/Tools/linux_arm64/std/lua/_std/haxe/format/JsonParser.hx
Normal file
@ -0,0 +1,292 @@
|
||||
/*
|
||||
* Copyright (C)2005-2019 Haxe Foundation
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package haxe.format;
|
||||
|
||||
/**
|
||||
An implementation of JSON parser in Haxe.
|
||||
|
||||
This class is used by `haxe.Json` when native JSON implementation
|
||||
is not available.
|
||||
|
||||
@see https://haxe.org/manual/std-Json-parsing.html
|
||||
**/
|
||||
class JsonParser {
|
||||
/**
|
||||
Parses given JSON-encoded `str` and returns the resulting object.
|
||||
|
||||
JSON objects are parsed into anonymous structures and JSON arrays
|
||||
are parsed into `Array<Dynamic>`.
|
||||
|
||||
If given `str` is not valid JSON, an exception will be thrown.
|
||||
|
||||
If `str` is null, the result is unspecified.
|
||||
**/
|
||||
static public inline function parse(str:String):Dynamic {
|
||||
return lua.lib.hxluasimdjson.Json.parse(str);
|
||||
}
|
||||
|
||||
var str:String;
|
||||
var pos:Int;
|
||||
|
||||
function new(str:String) {
|
||||
this.str = str;
|
||||
this.pos = 0;
|
||||
}
|
||||
|
||||
function doParse():Dynamic {
|
||||
var result = parseRec();
|
||||
var c;
|
||||
while (!StringTools.isEof(c = nextChar())) {
|
||||
switch (c) {
|
||||
case ' '.code, '\r'.code, '\n'.code, '\t'.code:
|
||||
// allow trailing whitespace
|
||||
default:
|
||||
invalidChar();
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
function parseRec():Dynamic {
|
||||
while (true) {
|
||||
var c = nextChar();
|
||||
switch (c) {
|
||||
case ' '.code, '\r'.code, '\n'.code, '\t'.code:
|
||||
// loop
|
||||
case '{'.code:
|
||||
var obj = {}, field = null, comma:Null<Bool> = null;
|
||||
while (true) {
|
||||
var c = nextChar();
|
||||
switch (c) {
|
||||
case ' '.code, '\r'.code, '\n'.code, '\t'.code:
|
||||
// loop
|
||||
case '}'.code:
|
||||
if (field != null || comma == false)
|
||||
invalidChar();
|
||||
return obj;
|
||||
case ':'.code:
|
||||
if (field == null)
|
||||
invalidChar();
|
||||
Reflect.setField(obj, field, parseRec());
|
||||
field = null;
|
||||
comma = true;
|
||||
case ','.code:
|
||||
if (comma) comma = false else invalidChar();
|
||||
case '"'.code:
|
||||
if (field != null || comma) invalidChar();
|
||||
field = parseString();
|
||||
default:
|
||||
invalidChar();
|
||||
}
|
||||
}
|
||||
case '['.code:
|
||||
var arr = [], comma:Null<Bool> = null;
|
||||
while (true) {
|
||||
var c = nextChar();
|
||||
switch (c) {
|
||||
case ' '.code, '\r'.code, '\n'.code, '\t'.code:
|
||||
// loop
|
||||
case ']'.code:
|
||||
if (comma == false) invalidChar();
|
||||
return arr;
|
||||
case ','.code:
|
||||
if (comma) comma = false else invalidChar();
|
||||
default:
|
||||
if (comma) invalidChar();
|
||||
pos--;
|
||||
arr.push(parseRec());
|
||||
comma = true;
|
||||
}
|
||||
}
|
||||
case 't'.code:
|
||||
var save = pos;
|
||||
if (nextChar() != 'r'.code || nextChar() != 'u'.code || nextChar() != 'e'.code) {
|
||||
pos = save;
|
||||
invalidChar();
|
||||
}
|
||||
return true;
|
||||
case 'f'.code:
|
||||
var save = pos;
|
||||
if (nextChar() != 'a'.code || nextChar() != 'l'.code || nextChar() != 's'.code || nextChar() != 'e'.code) {
|
||||
pos = save;
|
||||
invalidChar();
|
||||
}
|
||||
return false;
|
||||
case 'n'.code:
|
||||
var save = pos;
|
||||
if (nextChar() != 'u'.code || nextChar() != 'l'.code || nextChar() != 'l'.code) {
|
||||
pos = save;
|
||||
invalidChar();
|
||||
}
|
||||
return null;
|
||||
case '"'.code:
|
||||
return parseString();
|
||||
case '0'.code, '1'.code, '2'.code, '3'.code, '4'.code, '5'.code, '6'.code, '7'.code, '8'.code, '9'.code, '-'.code:
|
||||
return parseNumber(c);
|
||||
default:
|
||||
invalidChar();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function parseString() {
|
||||
// eq( haxe.format.JsonParser.parse('"\\u00E9"'), "é" );
|
||||
var start = pos;
|
||||
var buf:StringBuf = null;
|
||||
var prev = -1;
|
||||
inline function cancelSurrogate() {
|
||||
// invalid high surrogate (not followed by low surrogate)
|
||||
buf.addChar(0xFFFD);
|
||||
prev = -1;
|
||||
}
|
||||
while (true) {
|
||||
var c = nextChar();
|
||||
if (c == '"'.code)
|
||||
break;
|
||||
if (c == '\\'.code) {
|
||||
if (buf == null) {
|
||||
buf = new StringBuf();
|
||||
}
|
||||
buf.addSub(str, start, pos - start - 1);
|
||||
c = nextChar();
|
||||
switch (c) {
|
||||
case "r".code:
|
||||
buf.addChar("\r".code);
|
||||
case "n".code:
|
||||
buf.addChar("\n".code);
|
||||
case "t".code:
|
||||
buf.addChar("\t".code);
|
||||
case "b".code:
|
||||
buf.addChar(8);
|
||||
case "f".code:
|
||||
buf.addChar(12);
|
||||
case "/".code, '\\'.code, '"'.code:
|
||||
buf.addChar(c);
|
||||
case 'u'.code:
|
||||
var uc:Int = Std.parseInt("0x" + str.substr(pos, 4));
|
||||
pos += 4;
|
||||
if (prev != -1) {
|
||||
if (uc < 0xDC00 || uc > 0xDFFF)
|
||||
cancelSurrogate();
|
||||
else {
|
||||
buf.addChar(((prev - 0xD800) << 10) + (uc - 0xDC00) + 0x10000);
|
||||
prev = -1;
|
||||
}
|
||||
} else if (uc >= 0xD800 && uc <= 0xDBFF)
|
||||
prev = uc;
|
||||
else
|
||||
buf.addChar(uc);
|
||||
default:
|
||||
throw "Invalid escape sequence \\" + String.fromCharCode(c) + " at position " + (pos - 1);
|
||||
}
|
||||
start = pos;
|
||||
}
|
||||
// ensure utf8 chars are not cut
|
||||
else if (c >= 0x80) {
|
||||
pos++;
|
||||
if (c >= 0xFC)
|
||||
pos += 4;
|
||||
else if (c >= 0xF8)
|
||||
pos += 3;
|
||||
else if (c >= 0xF0)
|
||||
pos += 2;
|
||||
else if (c >= 0xE0)
|
||||
pos++;
|
||||
}
|
||||
else if (StringTools.isEof(c))
|
||||
throw "Unclosed string";
|
||||
}
|
||||
if (buf == null) {
|
||||
return str.substr(start, pos - start - 1);
|
||||
} else {
|
||||
buf.addSub(str, start, pos - start - 1);
|
||||
return buf.toString();
|
||||
}
|
||||
}
|
||||
|
||||
inline function parseNumber(c:Int):Dynamic {
|
||||
var start = pos - 1;
|
||||
var minus = c == '-'.code, digit = !minus, zero = c == '0'.code;
|
||||
var point = false, e = false, pm = false, end = false;
|
||||
while (true) {
|
||||
c = nextChar();
|
||||
switch (c) {
|
||||
case '0'.code:
|
||||
if (zero && !point)
|
||||
invalidNumber(start);
|
||||
if (minus) {
|
||||
minus = false;
|
||||
zero = true;
|
||||
}
|
||||
digit = true;
|
||||
case '1'.code, '2'.code, '3'.code, '4'.code, '5'.code, '6'.code, '7'.code, '8'.code, '9'.code:
|
||||
if (zero && !point)
|
||||
invalidNumber(start);
|
||||
if (minus)
|
||||
minus = false;
|
||||
digit = true;
|
||||
zero = false;
|
||||
case '.'.code:
|
||||
if (minus || point || e)
|
||||
invalidNumber(start);
|
||||
digit = false;
|
||||
point = true;
|
||||
case 'e'.code, 'E'.code:
|
||||
if (minus || zero || e)
|
||||
invalidNumber(start);
|
||||
digit = false;
|
||||
e = true;
|
||||
case '+'.code, '-'.code:
|
||||
if (!e || pm)
|
||||
invalidNumber(start);
|
||||
digit = false;
|
||||
pm = true;
|
||||
default:
|
||||
if (!digit)
|
||||
invalidNumber(start);
|
||||
pos--;
|
||||
end = true;
|
||||
}
|
||||
if (end)
|
||||
break;
|
||||
}
|
||||
|
||||
var f = Std.parseFloat(str.substr(start, pos - start));
|
||||
var i = Std.int(f);
|
||||
return if (i == f) i else f;
|
||||
}
|
||||
|
||||
function nextChar() {
|
||||
pos++;
|
||||
return lua.NativeStringTools.byte(str, pos);
|
||||
}
|
||||
|
||||
function invalidChar() {
|
||||
pos--; // rewind
|
||||
throw "Invalid char " + lua.NativeStringTools.byte(str, pos) + " at position " + pos;
|
||||
}
|
||||
|
||||
function invalidNumber(start:Int) {
|
||||
throw "Invalid number at position " + start + ": " + str.substr(start, pos - start);
|
||||
}
|
||||
}
|
@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Copyright (C)2005-2018 Haxe Foundation
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package haxe.iterators;
|
||||
import lua.lib.luautf8.Utf8;
|
||||
|
||||
class StringIterator {
|
||||
var codes : (String, Int)->StringCodePoint;
|
||||
var codepoint : Int;
|
||||
var str : String;
|
||||
var position : Int;
|
||||
public inline function new(s:String) {
|
||||
this.codes = Utf8.codes(s);
|
||||
this.str = s;
|
||||
var cp = codes(str, 0);
|
||||
this.codepoint = cp.codepoint;
|
||||
this.position = cp.position;
|
||||
}
|
||||
|
||||
public inline function hasNext() {
|
||||
return codepoint != null;
|
||||
}
|
||||
|
||||
public inline function next() {
|
||||
var ret = codepoint;
|
||||
var cp = codes(str, position);
|
||||
codepoint = cp.codepoint;
|
||||
position = cp.position;
|
||||
return ret;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user