forked from LeenkxTeam/LNXSDK
Update Files
This commit is contained in:
69
Kha/Tools/macos/std/php/_std/sys/io/File.hx
Normal file
69
Kha/Tools/macos/std/php/_std/sys/io/File.hx
Normal file
@ -0,0 +1,69 @@
|
||||
/*
|
||||
* 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 sys.io;
|
||||
|
||||
import php.Global.*;
|
||||
import php.Global;
|
||||
|
||||
@:coreApi class File {
|
||||
public static function getContent(path:String):String {
|
||||
return file_get_contents(path);
|
||||
}
|
||||
|
||||
public static function getBytes(path:String):haxe.io.Bytes {
|
||||
return haxe.io.Bytes.ofString(file_get_contents(path));
|
||||
}
|
||||
|
||||
public static function saveContent(path:String, content:String):Void {
|
||||
file_put_contents(path, content);
|
||||
}
|
||||
|
||||
public static function saveBytes(path:String, bytes:haxe.io.Bytes):Void {
|
||||
var f = write(path);
|
||||
f.write(bytes);
|
||||
f.close();
|
||||
}
|
||||
|
||||
public static function read(path:String, binary:Bool = true):FileInput {
|
||||
return @:privateAccess new FileInput(fopen(path, binary ? "rb" : "r"));
|
||||
}
|
||||
|
||||
public static function write(path:String, binary:Bool = true):FileOutput {
|
||||
return untyped new FileOutput(fopen(path, binary ? "wb" : "w"));
|
||||
}
|
||||
|
||||
public static function append(path:String, binary:Bool = true):FileOutput {
|
||||
return untyped new FileOutput(fopen(path, binary ? "ab" : "a"));
|
||||
}
|
||||
|
||||
public static function update(path:String, binary:Bool = true):FileOutput {
|
||||
if (!FileSystem.exists(path)) {
|
||||
write(path).close();
|
||||
}
|
||||
return untyped new FileOutput(fopen(path, binary ? "rb+" : "r+"));
|
||||
}
|
||||
|
||||
public static function copy(srcPath:String, dstPath:String):Void {
|
||||
Global.copy(srcPath, dstPath);
|
||||
}
|
||||
}
|
100
Kha/Tools/macos/std/php/_std/sys/io/FileInput.hx
Normal file
100
Kha/Tools/macos/std/php/_std/sys/io/FileInput.hx
Normal file
@ -0,0 +1,100 @@
|
||||
/*
|
||||
* 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 sys.io;
|
||||
|
||||
import haxe.io.Eof;
|
||||
import haxe.io.Error;
|
||||
import haxe.io.Bytes;
|
||||
import php.*;
|
||||
import php.Global.*;
|
||||
import php.Const.*;
|
||||
|
||||
@:coreApi
|
||||
class FileInput extends haxe.io.Input {
|
||||
private var __f:Resource;
|
||||
|
||||
function new(f:Resource):Void {
|
||||
__f = f;
|
||||
}
|
||||
|
||||
public override function readByte():Int {
|
||||
var r = fread(__f, 1);
|
||||
if (feof(__f))
|
||||
throw new Eof();
|
||||
if (r == false)
|
||||
throw Custom('An error occurred');
|
||||
return ord(r);
|
||||
}
|
||||
|
||||
public override function readBytes(s:Bytes, p:Int, l:Int):Int {
|
||||
if (feof(__f))
|
||||
throw new Eof();
|
||||
var r = fread(__f, l);
|
||||
if (r == false)
|
||||
throw Custom('An error occurred');
|
||||
if (strlen(r) == 0)
|
||||
throw new Eof();
|
||||
var b = Bytes.ofString(r);
|
||||
s.blit(p, b, 0, strlen(r));
|
||||
return strlen(r);
|
||||
}
|
||||
|
||||
public override function close():Void {
|
||||
super.close();
|
||||
if (__f != null)
|
||||
fclose(__f);
|
||||
}
|
||||
|
||||
public function seek(p:Int, pos:FileSeek):Void {
|
||||
var w;
|
||||
switch (pos) {
|
||||
case SeekBegin:
|
||||
w = SEEK_SET;
|
||||
case SeekCur:
|
||||
w = SEEK_CUR;
|
||||
case SeekEnd:
|
||||
w = SEEK_END;
|
||||
}
|
||||
var r = fseek(__f, p, w);
|
||||
if (r == -1)
|
||||
throw Custom('An error occurred');
|
||||
}
|
||||
|
||||
public function tell():Int {
|
||||
var r = ftell(__f);
|
||||
if (r == false)
|
||||
throw Custom('An error occurred');
|
||||
return cast r;
|
||||
}
|
||||
|
||||
public function eof():Bool {
|
||||
return feof(__f);
|
||||
}
|
||||
|
||||
override function readLine():String {
|
||||
var r = fgets(__f);
|
||||
if (false == r)
|
||||
throw new Eof();
|
||||
return rtrim(r, "\r\n");
|
||||
}
|
||||
}
|
86
Kha/Tools/macos/std/php/_std/sys/io/FileOutput.hx
Normal file
86
Kha/Tools/macos/std/php/_std/sys/io/FileOutput.hx
Normal file
@ -0,0 +1,86 @@
|
||||
/*
|
||||
* 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 sys.io;
|
||||
|
||||
import php.*;
|
||||
import php.Global.*;
|
||||
import php.Const.*;
|
||||
|
||||
@:coreApi
|
||||
class FileOutput extends haxe.io.Output {
|
||||
private var __f:Resource;
|
||||
|
||||
function new(f:Resource):Void {
|
||||
__f = f;
|
||||
}
|
||||
|
||||
public override function writeByte(c:Int):Void {
|
||||
var r = fwrite(__f, chr(c));
|
||||
if (r == false)
|
||||
throw haxe.io.Error.Custom('An error occurred');
|
||||
}
|
||||
|
||||
public override function writeBytes(b:haxe.io.Bytes, p:Int, l:Int):Int {
|
||||
var s = b.getString(p, l);
|
||||
if (feof(__f))
|
||||
throw new haxe.io.Eof();
|
||||
var r = fwrite(__f, s, l);
|
||||
if (r == false)
|
||||
throw haxe.io.Error.Custom('An error occurred');
|
||||
return r;
|
||||
}
|
||||
|
||||
public override function flush():Void {
|
||||
var r = fflush(__f);
|
||||
if (r == false)
|
||||
throw haxe.io.Error.Custom('An error occurred');
|
||||
}
|
||||
|
||||
public override function close():Void {
|
||||
super.close();
|
||||
if (__f != null)
|
||||
fclose(__f);
|
||||
}
|
||||
|
||||
public function seek(p:Int, pos:FileSeek):Void {
|
||||
var w;
|
||||
switch (pos) {
|
||||
case SeekBegin:
|
||||
w = SEEK_SET;
|
||||
case SeekCur:
|
||||
w = SEEK_CUR;
|
||||
case SeekEnd:
|
||||
w = SEEK_END;
|
||||
}
|
||||
var r = fseek(__f, p, w);
|
||||
if (r == -1)
|
||||
throw haxe.io.Error.Custom('An error occurred');
|
||||
}
|
||||
|
||||
public function tell():Int {
|
||||
var r = ftell(__f);
|
||||
if (r == false)
|
||||
throw haxe.io.Error.Custom('An error occurred');
|
||||
return r;
|
||||
}
|
||||
}
|
200
Kha/Tools/macos/std/php/_std/sys/io/Process.hx
Normal file
200
Kha/Tools/macos/std/php/_std/sys/io/Process.hx
Normal file
@ -0,0 +1,200 @@
|
||||
/*
|
||||
* 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 sys.io;
|
||||
|
||||
import php.*;
|
||||
import haxe.io.*;
|
||||
import haxe.SysTools;
|
||||
|
||||
using StringTools;
|
||||
using php.Global;
|
||||
|
||||
@:forward(iterator)
|
||||
private abstract ProcessPipes(NativeIndexedArray<Resource>) from NativeIndexedArray<Resource> to NativeIndexedArray<Resource> {
|
||||
public var stdin(get, never):Resource;
|
||||
public var stdout(get, never):Resource;
|
||||
public var stderr(get, never):Resource;
|
||||
|
||||
inline function get_stdin()
|
||||
return this[0];
|
||||
|
||||
inline function get_stdout()
|
||||
return this[1];
|
||||
|
||||
inline function get_stderr()
|
||||
return this[2];
|
||||
}
|
||||
|
||||
private class ReadablePipe extends Input {
|
||||
var pipe:Resource;
|
||||
var tmpBytes:Bytes;
|
||||
|
||||
public function new(pipe:Resource) {
|
||||
this.pipe = pipe;
|
||||
tmpBytes = Bytes.alloc(1);
|
||||
}
|
||||
|
||||
override public function close():Void {
|
||||
pipe.fclose();
|
||||
}
|
||||
|
||||
override public function readByte():Int {
|
||||
if (readBytes(tmpBytes, 0, 1) == 0)
|
||||
throw Error.Blocked;
|
||||
return tmpBytes.get(0);
|
||||
}
|
||||
|
||||
override public function readBytes(s:Bytes, pos:Int, len:Int):Int {
|
||||
if (pipe.feof())
|
||||
throw new Eof();
|
||||
|
||||
var result = pipe.fread(len);
|
||||
if (result == "")
|
||||
throw new Eof();
|
||||
if (result == false)
|
||||
return throw Error.Custom('Failed to read process output');
|
||||
var result:String = result;
|
||||
|
||||
var bytes = Bytes.ofString(result);
|
||||
s.blit(pos, bytes, 0, result.strlen());
|
||||
return result.strlen();
|
||||
}
|
||||
}
|
||||
|
||||
private class WritablePipe extends Output {
|
||||
var pipe:Resource;
|
||||
var tmpBytes:Bytes;
|
||||
|
||||
public function new(pipe:Resource) {
|
||||
this.pipe = pipe;
|
||||
tmpBytes = Bytes.alloc(1);
|
||||
}
|
||||
|
||||
override public function close():Void {
|
||||
pipe.fclose();
|
||||
}
|
||||
|
||||
override public function writeByte(c:Int):Void {
|
||||
tmpBytes.set(0, c);
|
||||
writeBytes(tmpBytes, 0, 1);
|
||||
}
|
||||
|
||||
override public function writeBytes(b:Bytes, pos:Int, l:Int):Int {
|
||||
var s = b.getString(pos, l);
|
||||
if (pipe.feof())
|
||||
throw new Eof();
|
||||
|
||||
var result = Global.fwrite(pipe, s, l);
|
||||
if (result == false)
|
||||
throw Error.Custom('Failed to write to process input');
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
class Process {
|
||||
public var stdout(default, null):Input;
|
||||
|
||||
public var stderr(default, null):Input;
|
||||
|
||||
public var stdin(default, null):Output;
|
||||
|
||||
var process:Resource;
|
||||
var pipes:ProcessPipes;
|
||||
var pid:Int = -1;
|
||||
var running:Bool = true;
|
||||
var _exitCode:Int = -1;
|
||||
|
||||
public function new(cmd:String, ?args:Array<String>, ?detached:Bool):Void {
|
||||
if (detached)
|
||||
throw "Detached process is not supported on this platform";
|
||||
var descriptors = Syntax.arrayDecl(Syntax.arrayDecl('pipe', 'r'), Syntax.arrayDecl('pipe', 'w'), Syntax.arrayDecl('pipe', 'w'));
|
||||
var result = buildCmd(cmd, args).proc_open(descriptors, pipes);
|
||||
if (result == false)
|
||||
throw Error.Custom('Failed to start process: $cmd');
|
||||
process = result;
|
||||
|
||||
updateStatus();
|
||||
|
||||
stdin = new WritablePipe(pipes.stdin);
|
||||
stdout = new ReadablePipe(pipes.stdout);
|
||||
stderr = new ReadablePipe(pipes.stderr);
|
||||
}
|
||||
|
||||
public function getPid():Int {
|
||||
return pid;
|
||||
}
|
||||
|
||||
public function exitCode(block:Bool = true):Null<Int> {
|
||||
if (!block) {
|
||||
updateStatus();
|
||||
return (running ? null : _exitCode);
|
||||
}
|
||||
while (running) {
|
||||
var arr = Syntax.arrayDecl(process);
|
||||
try {
|
||||
Syntax.suppress(Global.stream_select(arr, arr, arr, null));
|
||||
} catch(_) {}
|
||||
updateStatus();
|
||||
}
|
||||
return _exitCode;
|
||||
}
|
||||
|
||||
public function close():Void {
|
||||
if (!running)
|
||||
return;
|
||||
|
||||
for (pipe in pipes)
|
||||
Global.fclose(pipe);
|
||||
process.proc_close();
|
||||
}
|
||||
|
||||
public function kill():Void {
|
||||
process.proc_terminate();
|
||||
}
|
||||
|
||||
function buildCmd(cmd:String, ?args:Array<String>):String {
|
||||
if (args == null)
|
||||
return cmd;
|
||||
|
||||
return switch (Sys.systemName()) {
|
||||
case "Windows":
|
||||
[cmd.replace("/", "\\")].concat(args).map(SysTools.quoteWinArg.bind(_, true)).join(" ");
|
||||
case _:
|
||||
[cmd].concat(args).map(SysTools.quoteUnixArg).join(" ");
|
||||
}
|
||||
}
|
||||
|
||||
function updateStatus():Void {
|
||||
if (!running)
|
||||
return;
|
||||
|
||||
var status = process.proc_get_status();
|
||||
if (status == false)
|
||||
throw Error.Custom('Failed to obtain process status');
|
||||
var status:NativeAssocArray<Scalar> = status;
|
||||
|
||||
pid = status['pid'];
|
||||
running = status['running'];
|
||||
_exitCode = status['exitcode'];
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user