From 6c5772c6c8d9c91241c4bc82f30fb383b5ae0bf4 Mon Sep 17 00:00:00 2001 From: Mike Nolan Date: Fri, 28 Mar 2025 22:06:34 -0500 Subject: [PATCH] Adding some documentation to crosslang shell --- Templates/compiletool/cross.json | 3 +- Templates/console/cross.json | 3 +- Templates/lib/cross.json | 3 +- Templates/template/cross.json | 1 + Templates/tool/.crossarchiveignore | 2 + Templates/tool/cross.json | 25 + Templates/tool/src/main.tcross | 30 ++ .../src/PackageManager.tcross | 8 +- .../src/buildtool.tcross | 28 +- .../src/crossvmfile.tcross | 149 ------ .../src/helpers.tcross | 19 + .../src/version.tcross | 103 ---- Tesses.CrossLang.Documentation/create_doc.sh | 7 + Tesses.CrossLang.Documentation/cross.json | 14 + .../doc_projs/RuntimeObjects/cross.json | 7 + .../doc_projs/RuntimeObjects/src/main.tcross | 40 ++ .../docs/Runtime.md | 497 ++++++++++++++++++ .../docs/RuntimeObjects.md | 42 ++ .../src/main.tcross | 83 +++ Tesses.CrossLang.Shell/src/main.tcross | 344 +++++++++++- Tesses.CrossLang.Std/cross.json | 7 + Tesses.CrossLang.Std/src/time.tcross | 21 + crosslang_shell_archive_maker/src/main.tcross | 1 + .../1.0.0.0-prod | Bin 19872 -> 13184 bytes script.sh | 1 + 25 files changed, 1167 insertions(+), 271 deletions(-) create mode 100644 Templates/tool/.crossarchiveignore create mode 100644 Templates/tool/cross.json create mode 100644 Templates/tool/src/main.tcross delete mode 100644 Tesses.CrossLang.BuildEssentials/src/crossvmfile.tcross create mode 100644 Tesses.CrossLang.BuildEssentials/src/helpers.tcross delete mode 100644 Tesses.CrossLang.BuildEssentials/src/version.tcross create mode 100644 Tesses.CrossLang.Documentation/create_doc.sh create mode 100644 Tesses.CrossLang.Documentation/cross.json create mode 100644 Tesses.CrossLang.Documentation/doc_projs/RuntimeObjects/cross.json create mode 100644 Tesses.CrossLang.Documentation/doc_projs/RuntimeObjects/src/main.tcross create mode 100644 Tesses.CrossLang.Documentation/docs/Runtime.md create mode 100644 Tesses.CrossLang.Documentation/docs/RuntimeObjects.md create mode 100644 Tesses.CrossLang.Documentation/src/main.tcross create mode 100644 Tesses.CrossLang.Std/cross.json create mode 100644 Tesses.CrossLang.Std/src/time.tcross diff --git a/Templates/compiletool/cross.json b/Templates/compiletool/cross.json index 88f03ed..5b69738 100644 --- a/Templates/compiletool/cross.json +++ b/Templates/compiletool/cross.json @@ -11,6 +11,7 @@ "template_info": { "type": "compile_tool" }, - "template_ignored_files": ["bin","obj"] + "template_ignored_files": ["bin","obj"], + "description": "A tool that can be a dependency to a project (including libraries) that runs at compile time" } } diff --git a/Templates/console/cross.json b/Templates/console/cross.json index cd43f35..dda2c32 100644 --- a/Templates/console/cross.json +++ b/Templates/console/cross.json @@ -11,6 +11,7 @@ "template_info": { "type": "console" }, - "template_ignored_files": ["bin","obj"] + "template_ignored_files": ["bin","obj"], + "description": "A console application" } } diff --git a/Templates/lib/cross.json b/Templates/lib/cross.json index 86caa3d..6b53ba4 100644 --- a/Templates/lib/cross.json +++ b/Templates/lib/cross.json @@ -11,6 +11,7 @@ "template_info": { "type": "lib" }, - "template_ignored_files": ["bin","obj"] + "template_ignored_files": ["bin","obj"], + "description": "A crosslang library" } } diff --git a/Templates/template/cross.json b/Templates/template/cross.json index 3459e70..d54dd42 100644 --- a/Templates/template/cross.json +++ b/Templates/template/cross.json @@ -8,6 +8,7 @@ "homepage": "https://crosslang.tesseslanguage.com/", "license": "MIT", "template_name": "template", + "description": "A template for a project", "template_info": { "type": "template", "template_name": "mytemplate", diff --git a/Templates/tool/.crossarchiveignore b/Templates/tool/.crossarchiveignore new file mode 100644 index 0000000..1746e32 --- /dev/null +++ b/Templates/tool/.crossarchiveignore @@ -0,0 +1,2 @@ +bin +obj diff --git a/Templates/tool/cross.json b/Templates/tool/cross.json new file mode 100644 index 0000000..f08dd13 --- /dev/null +++ b/Templates/tool/cross.json @@ -0,0 +1,25 @@ +{ + "dependencies": [], + "info": { + "template_ignored_files": [ + "bin", + "obj" + ], + "template_info": { + "type": "tool", + "description": "This is my tool", + "toolname": "changeme" + }, + "template_extra_text_ftles": [], + "template_project_dependencies": [], + "template_name": "tool", + "description": "A crosslang tool that you can run via crosslang tool", + "type": "template", + "maintainer": "Mike Nolan", + "repo": "https://onedev.site.tesses.net/CrossLang/CrossLangExtras", + "homepage": "https://crosslang.tesseslanguage.com/", + "license": "MIT" + }, + "version": "1.0.0.0-prod", + "name": "Tesses.CrossLang.Template.Tool" +} \ No newline at end of file diff --git a/Templates/tool/src/main.tcross b/Templates/tool/src/main.tcross new file mode 100644 index 0000000..006d074 --- /dev/null +++ b/Templates/tool/src/main.tcross @@ -0,0 +1,30 @@ +/* + you must change the toolname in cross.json -> info -> toolname + to run the tool from the project folder use crosslang tool-test [flags-options-and-arguments] + to install the tool use crosslang install-tool from working directory + to run the tool after being installed use crosslang tool [flags-and-options-and-arguments] + you can push the tool to cpkg +*/ +func RunTool(arg) +{ + //Flags are strings without the -- just like from Tesses.CrossLang.Args, so --Johnny would yield a string with the value Johnny + //Options are a dictionary with a field named Key which is the name without the -- just like from Tesses.CrossLang.Args where the Value is from after the = sign just like Tesses.CrossLang.Args, so --John=Joel would yield a dictionary like this {Key="John", Value="Joel"} + //Arguments is a list of strings when an argument does not start with -- or is after the -- (it starts after the tool name) + //ToolName is the tool name + Console.WriteLine($"TOOLNAME: {arg.ToolName}"); + Console.WriteLine("FLAGS:"); + each(var flag : arg.Flags) + { + Console.WriteLine(flag); + } + Console.WriteLine("OPTIONS:"); + each(var option : arg.Options) + { + Console.WriteLine($"{option.Key}: {option.Value}"); + } + Console.WriteLine("ARGUMENTS:"); + each(var argument : arg.Arguments) + { + Console.WriteLine(argument); + } +} diff --git a/Tesses.CrossLang.BuildEssentials/src/PackageManager.tcross b/Tesses.CrossLang.BuildEssentials/src/PackageManager.tcross index db6a725..4089da1 100644 --- a/Tesses.CrossLang.BuildEssentials/src/PackageManager.tcross +++ b/Tesses.CrossLang.BuildEssentials/src/PackageManager.tcross @@ -58,8 +58,8 @@ func Tesses.CrossLang.PackageManager() }, GetPackage = (this,name, version) => { - var v = Tesses.CrossLang.Version.Parse(version); - var useCache = v.Stage != Tesses.CrossLang.Version.Dev; + var v = Version.Parse(version); + var useCache = v.Stage != "dev"; var pkgFile = packageCache / name / v.ToString(); if(useCache && FS.Local.RegularFileExists(pkgFile)) { @@ -97,13 +97,13 @@ func Tesses.CrossLang.PackageManager() if(this.Offline || pkgServers.Count == 0) { //user has declared they are offline or don't have packageServers look through packages locally - var version = Tesses.CrossLang.Version.Create(0,0,0,0,0); + var version = new Version(0,0,0,0,"dev"); var configRoot = Path.FromString(Env.Config) / "Tesses" / "CrossLang"; var dir = configRoot / "PackageCache" / name; if(FS.Local.DirectoryExists(dir)) each(var f : FS.Local.EnumeratePaths(dir)) { - var v = Tesses.CrossLang.Version.Parse(f.GetFileName()); + var v = Version.Parse(f.GetFileName()); if(v >= version) { version = v; diff --git a/Tesses.CrossLang.BuildEssentials/src/buildtool.tcross b/Tesses.CrossLang.BuildEssentials/src/buildtool.tcross index ae0bcdc..998967e 100644 --- a/Tesses.CrossLang.BuildEssentials/src/buildtool.tcross +++ b/Tesses.CrossLang.BuildEssentials/src/buildtool.tcross @@ -32,8 +32,8 @@ func Tesses.CrossLang.BuildTool(pm) strm.Close(); var strm = FS.Local.OpenFile(pkgPath,"rb"); - var package = Tesses.CrossLang.CrossVMFile(); - package.Read(strm); + + var package = VM.LoadExecutable(strm); strm.Close(); var deps = []; @@ -42,6 +42,10 @@ func Tesses.CrossLang.BuildTool(pm) { deps.Add(this.GetPackageDependencies(dep.Name, dep.Version, dir)); } + each(var pkg : package.Tools) + { + dep.Add(this.GetPackageDependencies(dep.Name, dep.Version, dir)); + } return { Name = name, @@ -54,6 +58,7 @@ func Tesses.CrossLang.BuildTool(pm) BuildProject = (this,projectDirectory)=>{ var dir = FS.MakeFull(projectDirectory); var dirStr = dir.ToString(); + each(var item : this.DirectoriesCompiled) { @@ -71,6 +76,7 @@ func Tesses.CrossLang.BuildTool(pm) var objDir = "obj"; var srcDir = "src"; var resDir = "res"; + var icon = ""; if(TypeOf(configData.name) != "Undefined") name = configData.name; @@ -87,6 +93,8 @@ func Tesses.CrossLang.BuildTool(pm) resDir = configData.resource_directory; if(TypeOf(configData.info) != "Undefined") info = configData.info; + if(TypeOf(configData.icon) != "Undefined") + icon = configData.icon; @@ -108,7 +116,7 @@ func Tesses.CrossLang.BuildTool(pm) } FS.WriteAllText(FS.Local, dir / ".crossarchiveignore", ignored); } - FS.CreateArchive(subdir, outFile, name, version, Json.Encode(info)); + FS.CreateArchive(subdir, outFile, name, version, Json.Encode(info),icon); outFile.Close(); subdir.Close(); return null; @@ -139,6 +147,7 @@ func Tesses.CrossLang.BuildTool(pm) dependencies.Add(this.GetPackageDependencies(dep.name,dep.version,dir / objDir / "packages")); } } + each(var item : this.DirectoriesCompiled) { @@ -168,7 +177,8 @@ func Tesses.CrossLang.BuildTool(pm) env.GetDictionary().RunTool({ Project = FS.SubdirFilesystem(FS.Local, dir), ProjectInfo = info, - GeneratedSource = sources + GeneratedSource = sources, + Config = this.Config }); } else @@ -182,6 +192,7 @@ func Tesses.CrossLang.BuildTool(pm) } var file_deps = []; + var file_tools = []; each(var dep : dependencies) { @@ -192,6 +203,13 @@ func Tesses.CrossLang.BuildTool(pm) Version = dep.Version }); } + else if(dep.Info.type == "compile_tool") + { + file_tools.Add({ + Name = dep.Name, + Version = dep.Version + }); + } walk_for_compiling(dep,dir / outputDir); } @@ -225,6 +243,8 @@ func Tesses.CrossLang.BuildTool(pm) Version = version, Sources = sources, Info = Json.Encode(info), + Icon = icon, + Tools = file_tools, ResourceFileSystem = FS.SubdirFilesystem(FS.Local, dir / resDir), Dependencies = file_deps, Output = outFile diff --git a/Tesses.CrossLang.BuildEssentials/src/crossvmfile.tcross b/Tesses.CrossLang.BuildEssentials/src/crossvmfile.tcross deleted file mode 100644 index 0730407..0000000 --- a/Tesses.CrossLang.BuildEssentials/src/crossvmfile.tcross +++ /dev/null @@ -1,149 +0,0 @@ -func Tesses.CrossLang.CrossVMFile() -{ - return { - Info = "", - Name = "", - Version = "", - Dependencies = [], - Chunks = [], - Strings = [], - Functions = [], - Resources = [], - Sections = [], - Ensure = (this,strm,buff,len) =>{ - if(strm.ReadBlock(buff,0,len) != len) - throw $"Could not read {len} byte(s)"; - }, - EnsureInt = (this,strm)=>{ - var buff = ByteArray(4); - this.Ensure(strm,buff,4); - var number = 0; - number |= buff[0] << 24; - number |= buff[1] << 16; - number |= buff[2] << 8; - number |= buff[3]; - return number; - }, - EnsureString = (this,strm)=>{ - var len = this.EnsureInt(strm); - var buff = ByteArray(len); - this.Ensure(strm, buff,len); - return buff.ToString(); - }, - GetString = (this,strm)=>{ - var index = this.EnsureInt(strm); - if(index < this.Strings.Count) return this.Strings[index]; - throw $"{index} is not less than {this.Strings.Count}"; - }, - Read = (this,stream)=>{ - var header = ByteArray(8); - this.Ensure(stream, header, header.Count); - - var hdrStr = header.ToString(); - if(hdrStr != "TCROSSVM") throw "Invalid TCrossVM image."; - - this.Ensure(stream, header, 5); - - var version = Tesses.CrossLang.Version.FromBytes(header, 0); - - if(version > Tesses.CrossLang.Version.Current) throw "Runtime is too old."; - this.Ensure(stream, header, 5); - - - this.Version = Tesses.CrossLang.Version.FromBytes(header,0); - - var sec = ByteArray(4); - var sectionCount = this.EnsureInt(stream); - - - for(var i = 0; i < sectionCount; i++) - { - - this.Ensure(stream, sec, sec.Count); - hdrStr = sec.ToString(); - var tableLength = this.EnsureInt(stream); - if(hdrStr == "NAME") - { - this.Name = this.GetString(stream); - } - else if(hdrStr == "INFO") - { - this.Info = this.GetString(stream); - } - else if(hdrStr == "DEPS") - { - var _name = this.GetString(stream); - this.Ensure(stream, header, 5); - var _version = Tesses.CrossLang.Version.FromBytes(header,0); - this.Dependencies.Add({ - Name = _name, - Version = _version - }); - } - else if(hdrStr == "RESO") - { - var resource = ByteArray(tableLength); - this.Ensure(stream,resource,resource.Count); - this.Resources.Add(resource); - } - else if(hdrStr == "CHKS") - { - var chunkCount = this.EnsureInt(stream); - for(var j = 0; j < chunkCount; j++) - { - var _args = []; - var _argCount = this.EnsureInt(stream); - for(var k = 0; k < _argCount; k++) - { - _args.Add(this.GetString(stream)); - } - var _code = ByteArray(this.EnsureInt(stream)); - this.Ensure(stream,_code,_code.Count); - var chunk = { - Arguments = _args, - Code = _code - }; - this.Chunks.Add(chunk); - } - } - else if(hdrStr == "FUNS") - { - var funLen = this.EnsureInt(stream); - for(var j = 0; j < funLen; j++) - { - var fnPartsCount = this.EnsureInt(stream); - var documentation = ""; - var fnParts = []; - for(var k = 0; k < fnPartsCount; k++) - { - if(k == 0) documentation = this.GetString(stream); - else fnParts.Add(this.GetString(stream)); - } - var fnId = this.EnsureInt(stream); - this.Functions.Add({ - Documentation=documentation, - FunctionNameParts = fnParts, - Closure = fnId - }); - } - } - else if(hdrStr == "STRS") - { - var strcnt = this.EnsureInt(stream); - for(var j = 0; j < strcnt; j++) - { - this.Strings.Add(this.EnsureString(stream)); - } - } - else { - var data = ByteArray(tableLength); - this.Ensure(stream,data,data.Count); - this.Sections.Add({ - Name=hdrStr, - Data = data - }); - } - } - } - }; -} \ No newline at end of file diff --git a/Tesses.CrossLang.BuildEssentials/src/helpers.tcross b/Tesses.CrossLang.BuildEssentials/src/helpers.tcross new file mode 100644 index 0000000..5dc88a8 --- /dev/null +++ b/Tesses.CrossLang.BuildEssentials/src/helpers.tcross @@ -0,0 +1,19 @@ +func Tesses.CrossLang.GetNameAndDescription(name) +{ + var strm = FS.Local.OpenFile(name,"rb"); + var file = VM.LoadExecutable(strm); + + strm.Close(); + + var name = file.Name; + + var j = Json.Decode(file.Info); + var description = TypeOf(j.description) == "String" ? j.description : ""; + + if(j.type == "template") + name = TypeOf(j.template_name) == "String" ? j.template_name : name; + else if(j.type == "tool") + name = TypeOf(j.toolname) == "String" ? j.toolname : name; + + return $"{name}: {description}"; +} \ No newline at end of file diff --git a/Tesses.CrossLang.BuildEssentials/src/version.tcross b/Tesses.CrossLang.BuildEssentials/src/version.tcross deleted file mode 100644 index d243398..0000000 --- a/Tesses.CrossLang.BuildEssentials/src/version.tcross +++ /dev/null @@ -1,103 +0,0 @@ -func Tesses.CrossLang.Version.Create(major,minor,patch,build,stage) -{ - return { - Major = major, - Minor = minor, - Patch = patch, - Build = build, - Stage = stage, - getBuildAsInt = (this)=>{ - return ((this.Build & 0x3FFF) << 2) | ((this.Stage & 0x03)); - }, - getVersionInt = (this)=>{ - return ((this.Major & 0xFF) << 32) | ((this.Minor & 0xFF) << 24) - | ((this.Patch & 0xFF) << 16) | (this.BuildAsInt & 0xFFFF); - }, - operator< = (this,right)=>{ - return this.VersionInt < right.VersionInt; - }, - operator> = (this,right)=>{ - return this.VersionInt > right.VersionInt; - }, - operator== = (this,right)=>{ - return this.VersionInt == right.VersionInt; - }, - operator<= = (this,right)=>{ - return this.VersionInt <= right.VersionInt; - }, - operator>= = (this,right)=>{ - return this.VersionInt >= right.VersionInt; - }, - operator!= = (this,right)=>{ - return this.VersionInt != right.VersionInt; - }, - ToString = (this) => { - var stage = this.Stage == 0 ? "dev" : this.Stage == 1 ? "alpha" : this.Stage == 2 ? "beta" : "prod"; - return $"{this.Major & 0xFF}.{this.Minor & 0xFF}.{this.Patch & 0xFF}.{this.Build & 0x3FFF}-{stage}"; - }, - ToBytes = (this, buff, off) => { - if((buff.Count - offset) < 5) throw "Not long enough"; - buff[off] = this.Major; - buff[off+1] = this.Minor; - buff[off+2] = this.Patch; - var b = this.BuildAsInt; - buff[off+3] = (b >> 8) & 0xFF; - buff[off+4] = b & 0xFF; - } - }; -} -func Tesses.CrossLang.Version.FromBytes(buffer, offset) -{ - - if((buffer.Count - offset) < 5) throw "Not long enough"; - - var major = buffer[offset]; - var minor = buffer[offset+1]; - var patch = buffer[offset+2]; - - var buildI = (buffer[offset+3] << 8) | (buffer[offset+4]); - - var build = (buildI >> 2); - - - var stage = buildI & 0x03; - - var b = Tesses.CrossLang.Version.Create(major,minor,patch,build,stage); - return b; -} -func Tesses.CrossLang.Version.CreateEmpty() -{ - return Tesses.CrossLang.Version.Create(1,0,0,0,Tesses.CrossLang.Version.Prod); -} -func Tesses.CrossLang.Version.Parse(ver) -{ - var mySplit = ver.Split("-",false,2); - var version = 3; - if(mySplit.Count >= 1) - { - if(mySplit.Count == 2) - { - if(mySplit[1] == "dev") version = 0; - else if(mySplit[1] == "alpha") version = 1; - else if(mySplit[2] == "beta") version = 2; - } - var vpart = mySplit[0].Split(".",false,4); - var major = 1; - var minor = 0; - var patch = 0; - var build = 0; - - if(vpart.Count >= 1) major = ParseLong(vpart[0]); if(TypeOf(major) != "Long") major = 1; - if(vpart.Count >= 2) minor = ParseLong(vpart[1]); if(TypeOf(minor) != "Long") minor = 0; - if(vpart.Count >= 3) patch = ParseLong(vpart[2]); if(TypeOf(patch) != "Long") patch = 0; - if(vpart.Count >= 4) build = ParseLong(vpart[3]); if(TypeOf(build) != "Long") build = 0; - - return Tesses.CrossLang.Version.Create(major,minor,patch,build,version); - } -} -Tesses.CrossLang.Version.Dev = 0; -Tesses.CrossLang.Version.Alpha = 1; -Tesses.CrossLang.Version.Beta = 2; -Tesses.CrossLang.Version.Prod = 3; - -Tesses.CrossLang.Version.Current = Tesses.CrossLang.Version.Create(1,0,0,0,Tesses.CrossLang.Version.Prod); \ No newline at end of file diff --git a/Tesses.CrossLang.Documentation/create_doc.sh b/Tesses.CrossLang.Documentation/create_doc.sh new file mode 100644 index 0000000..103a589 --- /dev/null +++ b/Tesses.CrossLang.Documentation/create_doc.sh @@ -0,0 +1,7 @@ +#!/bin/bash +mkdir docs +crosslang run > docs/Runtime.md +cd doc_projs/RuntimeObjects +crosslang build +cd ../.. +crosslang run doc_projs/RuntimeObjects/bin/*.crvm > docs/RuntimeObjects.md \ No newline at end of file diff --git a/Tesses.CrossLang.Documentation/cross.json b/Tesses.CrossLang.Documentation/cross.json new file mode 100644 index 0000000..222399a --- /dev/null +++ b/Tesses.CrossLang.Documentation/cross.json @@ -0,0 +1,14 @@ +{ + "version": "1.0.0.0-prod", + "info": { + "maintainer": "Mike Nolan", + "type": "console", + "repo": "https://onedev.site.tesses.net/CrossLang/CrossLangExtras", + "homepage": "https://crosslang.tesseslanguage.com/", + "license": "LGPLv3" + }, + "project_dependencies": [ + "../Tesses.CrossLang.BuildEssentials" + ], + "name": "Tesses.CrossLang.Documentation" +} diff --git a/Tesses.CrossLang.Documentation/doc_projs/RuntimeObjects/cross.json b/Tesses.CrossLang.Documentation/doc_projs/RuntimeObjects/cross.json new file mode 100644 index 0000000..8179e27 --- /dev/null +++ b/Tesses.CrossLang.Documentation/doc_projs/RuntimeObjects/cross.json @@ -0,0 +1,7 @@ +{ + "info": { + "type": "lib" + }, + "version": "1.0.0.0-prod", + "name": "CrossLang Runtime Objects (this and the root dictionaries are implcit)" +} \ No newline at end of file diff --git a/Tesses.CrossLang.Documentation/doc_projs/RuntimeObjects/src/main.tcross b/Tesses.CrossLang.Documentation/doc_projs/RuntimeObjects/src/main.tcross new file mode 100644 index 0000000..d9dc90b --- /dev/null +++ b/Tesses.CrossLang.Documentation/doc_projs/RuntimeObjects/src/main.tcross @@ -0,0 +1,40 @@ +/^Get index of string or char in string, returns -1 if not found^/ +func String.IndexOf(this, textOrChr) +{ + +} +/^Get index of string or char in string, returns -1 if not found^/ +func String.LastIndexOf(this, textOrChr) +{ + +} +/^Get the enumerator ^/ +func String.GetEnumerator(this) +{ + +} +/^Get the substring of a string, if length is not provided it spans the rest of the string provided by this^/ +func String.Substring(this, offset, $length) +{ + +} +/^Remove text from a string, if length is not provided it spans the rest of the string provided by this^/ +func String.Remove(this, offset, $length) +{ + +} +/^Trim the start of string till char is not chr, if chr is not provided space will be used^/ +func String.TrimStart(this, $chr) +{ + +} +/^Trim the end of string till char is not chr, if chr is not provided space will be used^/ +func String.TrimEnd(this, $chr) +{ + +} +/^Escape a crosslang string for eval, quote determines whether the string should be quoted or not, by default not^/ +func String.Escape(this, $eval) +{ + +} \ No newline at end of file diff --git a/Tesses.CrossLang.Documentation/docs/Runtime.md b/Tesses.CrossLang.Documentation/docs/Runtime.md new file mode 100644 index 0000000..a4846b2 --- /dev/null +++ b/Tesses.CrossLang.Documentation/docs/Runtime.md @@ -0,0 +1,497 @@ +# CrossLang Runtime Documentation +```go +/^ Start a process ^/ +func Process.Start(process_object); +``` + +```go +/^ Get whether object is a list or dynamic list ^/ +func TypeIsList(object); +``` + +```go +/^ Get whether object is a stream ^/ +func TypeIsStream(object); +``` + +```go +/^ Get whether object is a dictionary or dynamic dictionary ^/ +func TypeIsDictionary(object); +``` + +```go +/^ Get whether object is callable ^/ +func TypeIsCallable(object); +``` + +```go +/^ Get whether object is a string ^/ +func TypeIsString(object); +``` + +```go +/^ Get whether object is a number ^/ +func TypeIsNumber(object); +``` + +```go +/^ Listen (creates application loop) ^/ +func Net.Http.ListenSimpleWithLoop(server, port); +``` + +```go +/^ Create an http request ^/ +func Net.Http.MakeRequest(url, $extra); +``` + +```go +/^ Url encode path ^/ +func Net.Http.UrlPathEncode(path); +``` + +```go +/^ Url decode query param ^/ +func Net.Http.UrlDecode(param); +``` + +```go +/^ Url encode query param ^/ +func Net.Http.UrlEncode(param); +``` + +```go +/^ Get mimetype from extension ^/ +func Net.Http.MimeType(ext); +``` + +```go +/^ Url decode path ^/ +func Net.Http.UrlPathDecode(path); +``` + +```go +/^ Html encode ^/ +func Net.Http.HtmlEncode(param); +``` + +```go +/^ Create a network stream ^/ +func Net.NetworkStream(ipv6, datagram); +``` + +```go +/^ Get whether object is a double (not a long) ^/ +func TypeIsDouble(object); +``` + +```go +/^ Clear renderer with renderer draw color ^/ +func SDL2.RenderClear(renderer); +``` + +```go +/^ Init SDL2 ^/ +func SDL2.Init(); +``` + +```go +/^ Present frame (you are finished with the frame) ^/ +func SDL2.RenderPresent(renderer); +``` + +```go +/^ Set SDL2 Renderer Draw Color ^/ +func SDL2.SetRenderDrawColor(renderer, r, g, b, a); +``` + +```go +/^ Create a SDL2 Window ^/ +func SDL2.CreateWindow(title, x, y, w, h, flags); +``` + +```go +/^ Get events ^/ +func SDL2.PollEvent(); +``` + +```go +/^ Fill a rectangle using SDL ^/ +func SDL2.RenderFillRect(renderer, dictionary_with_x_y_w_h); +``` + +```go +/^ Draw a rectangle using SDL ^/ +func SDL2.RenderDrawRect(renderer, dictionary_with_x_y_w_h); +``` + +```go +/^ Create a SDL2 Renderer ^/ +func SDL2.CreateRenderer(window, ); +``` + +```go +/^ Base64 encode ^/ +func Crypto.Base64Encode(data); +``` + +```go +/^ Sha512 Algorithm ^/ +func Crypto.Sha512($is384); +``` + +```go +/^ Sha256 Algorithm ^/ +func Crypto.Sha256($is224); +``` + +```go +/^ Sha1 Algorithm (needed for WebSocket handshake/BitTorrent etc) (don't use unless you have no other choice) ^/ +func Crypto.Sha1(); +``` + +```go +/^ Base64 decode ^/ +func Crypto.Base64Decode(str); +``` + +```go +/^ Create bytearray but with random bytes in it instead of zeros (this uses mbedtls by the way) ^/ +func Crypto.RandomBytes(byteCount, personalString); +``` + +```go +/^ Hash passwords with PBKDF2 ^/ +func Crypto.PBKDF2(pass, salt, itterations, keylen, shanum); +``` + +```go +/^ Get whether object is a long (not a double) ^/ +func TypeIsLong(object); +``` + +```go +/^ Get whether object is not null or undefined ^/ +func TypeIsDefined(object); +``` + +```go +/^ Eval source code ^/ +func VM.Eval(source); +``` + +```go +/^ Load a crossvm executable ^/ +func VM.LoadExecutable(stream); +``` + +```go +/^ Create root environment ^/ +func VM.CreateEnvironment($dict); +``` + +```go +/^ Compile Source ^/ +func VM.Compile(dict); +``` + +```go +/^ Get current environment for reflection purposes ^/ +func VM.getCurrentEnvironment(); +``` + +```go +/^ Get root environment for reflection purposes ^/ +func VM.getRootEnvironment(); +``` + +```go +/^ Get root environment as a dictionary ^/ +func VM.getRootEnvironmentAsDictionary(); +``` + +```go +/^ Get whether object is susceptible to garbage collection ^/ +func TypeIsHeap(object); +``` + +```go +/^ Parse Long from String ^/ +func ParseLong(arg, $base); +``` + +```go +/^ Parse Double from String ^/ +func ParseDouble(arg); +``` + +```go +/^ Get a field in dictionary ^/ +func Dictionary.GetField(dict, key); +``` + +```go +/^ Set a field in dictionary ^/ +func Dictionary.SetField(dict, key, value); +``` + +```go +/^ Get Dictionary Item Enumerable for the each(item : Dictionary.Items(myDict)){item.Key; item.Value;} ^/ +func Dictionary.Items(dictionary); +``` + +```go +/^ Get environment variable ^/ +func Env.GetAt(key); +``` + +```go +/^ Get cache folder ^/ +func Env.getCache(); +``` + +```go +/^ Set environment variable ^/ +func Env.SetAt(key, value); +``` + +```go +/^ Get downloads folder ^/ +func Env.getDesktop(); +``` + +```go +/^ Get platform name ^/ +func Env.getPlatform(); +``` + +```go +/^ Get documents folder ^/ +func Env.getDocuments(); +``` + +```go +/^ Get downloads folder ^/ +func Env.getDownloads(); +``` + +```go +/^ Get user folder ^/ +func Env.getUser(); +``` + +```go +/^ Get pictures folder ^/ +func Env.getPictures(); +``` + +```go +/^ Get music folder ^/ +func Env.getMusic(); +``` + +```go +/^ Get videos folder ^/ +func Env.getVideos(); +``` + +```go +/^ Get state folder ^/ +func Env.getState(); +``` + +```go +/^ Get the absolute path for executable ^/ +func Env.GetRealExecutablePath(path); +``` + +```go +/^ Get config folder ^/ +func Env.getConfig(); +``` + +```go +/^ Get data folder ^/ +func Env.getData(); +``` + +```go +/^ Get whether object is a virtual filesystem ^/ +func TypeIsVFS(object); +``` + +```go +/^ Create regex object ^/ +func Regex(regex); +``` + +```go +/^ Create thread ^/ +func Thread(callback); +``` + +```go +/^ Create bytearray with optional either size (to size it) or string argument (to fill byte array) ^/ +func ByteArray($data); +``` + +```go +/^ Get type of object ^/ +func TypeOf(object); +``` + +```go +/^ Create a Path from parts ^/ +func Path.Create(relative, parts); +``` + +```go +/^ Create Absolute Root Path ^/ +func Path.Root(); +``` + +```go +/^ Create a Path from string ^/ +func Path.FromString(path); +``` + +```go +/^ Stop the program with an optional error message ^/ +func Console.Fatal($text); +``` + +```go +/^ Reads a byte from stdin ^/ +func Console.Read(); +``` + +```go +/^ Set whether terminal is sending signals for CTRL+C (true) or via read (false) ^/ +func Console.setSignals(flag); +``` + +```go +/^ Get whether terminal is sending signals for CTRL+C (true) or via read (false) ^/ +func Console.getSignals(); +``` + +```go +/^ Write text "text" to stdout ^/ +func Console.Write(text); +``` + +```go +/^ Reads line from stdin ^/ +func Console.ReadLine(); +``` + +```go +/^ Set whether terminal is buffering line by line (true) or byte by byte (false) ^/ +func Console.setCanonical(flag); +``` + +```go +/^ Get whether terminal is buffering line by line (true) or byte by byte (false) ^/ +func Console.getCanonical(); +``` + +```go +/^ Set whether terminal is echoing characters read ^/ +func Console.setEcho(flag); +``` + +```go +/^ Write text "text" to stdout with new line ^/ +func Console.WriteLine(text); +``` + +```go +/^ Get whether terminal is echoing characters read ^/ +func Console.getEcho(); +``` + +```go +/^ Create in memory filesystem ^/ +func FS.CreateMemoryFilesystem(); +``` + +```go +/^ Create filesystem ^/ +func FS.CreateFilesystem(fs); +``` + +```go +/^ Create stream ^/ +func FS.CreateStream(strm); +``` + +```go +/^ Extract a crvm archive ^/ +func FS.ExtractArchive(strm, vfs); +``` + +```go +/^ Create a memory stream ^/ +func FS.MemoryStream(writable); +``` + +```go +/^ Create a subdir filesystem ^/ +func FS.SubdirFilesystem(fs, subdir); +``` + +```go +/^ Create a mountable filesystem ^/ +func FS.MountableFilesystem(root); +``` + +```go +/^ Write all text to file ^/ +func FS.WriteAllText(fs, filename, content); +``` + +```go +/^ Read all text from file ^/ +func FS.ReadAllText(fs, filename); +``` + +```go +/^ Create a crvm archive ^/ +func FS.CreateArchive(fs, strm, name, version, info); +``` + +```go +/^ Make absolute path from relative path ^/ +func FS.MakeFull(path); +``` + +```go +/^ Escape sql text ^/ +func Sqlite.Escape(text); +``` + +```go +/^ Close sql database ^/ +func Sqlite.Close(handle); +``` + +```go +/^ Execute sql (returns dictionary of columns key=value an error message as string or undefined) ^/ +func Sqlite.Exec(handle, sql); +``` + +```go +/^ Opens the database (returns database handle or an error message as string or undefined) ^/ +func Sqlite.Open(filename); +``` + +```go +/^ Serialize Json ^/ +func Json.Encode(any, $indent); +``` + +```go +/^ Deserialize Json ^/ +func Json.Decode(Json string); +``` + + diff --git a/Tesses.CrossLang.Documentation/docs/RuntimeObjects.md b/Tesses.CrossLang.Documentation/docs/RuntimeObjects.md new file mode 100644 index 0000000..fcc6c99 --- /dev/null +++ b/Tesses.CrossLang.Documentation/docs/RuntimeObjects.md @@ -0,0 +1,42 @@ +# CrossLang Runtime Objects (this and the root dictionaries are implcit) Documentation +```go +/^ Get index of string or char in string returns -1 if not found ^/ +func String.IndexOf(this, textOrChr); +``` + +```go +/^ Get index of string or char in string returns -1 if not found ^/ +func String.LastIndexOf(this, textOrChr); +``` + +```go +/^ Get the enumerator ^/ +func String.GetEnumerator(this, textOrChr); +``` + +```go +/^ Get the substring of a string if length is not provided it spans the rest of the string provided by this ^/ +func String.Substring(this, textOrChr); +``` + +```go +/^ Remove text from a string if length is not provided it spans the rest of the string provided by this ^/ +func String.Remove(this, textOrChr); +``` + +```go +/^ Trim the start of string till char is not chr if chr is not provided space will be used ^/ +func String.TrimStart(this, textOrChr); +``` + +```go +/^ Trim the end of string till char is not chr if chr is not provided space will be used ^/ +func String.TrimEnd(this, textOrChr); +``` + +```go +/^ Escape a crosslang string for eval quote determines whether the string should be quoted or not by default not ^/ +func String.Escape(this, textOrChr); +``` + + diff --git a/Tesses.CrossLang.Documentation/src/main.tcross b/Tesses.CrossLang.Documentation/src/main.tcross new file mode 100644 index 0000000..da38db2 --- /dev/null +++ b/Tesses.CrossLang.Documentation/src/main.tcross @@ -0,0 +1,83 @@ +var fns = []; +func Crawl(c,name) +{ + if(TypeOf(c) == "Dictionary") + { + each(var item : Dictionary.Items(c)) + { + Crawl(item.Value,name.Count == 0 ? item.Key : $"{name}.{item.Key}"); + } + } + else if(TypeOf(c) == "ExternalMethod") + { + fns.Add({ + Name = name, + Documentation = c.Documentation, + Arguments = c.Arguments + }); + } +} +func main(args) +{ + var md = ""; + if(args.Count == 2) + { + var strm = FS.Local.OpenFile(args[1],"rb"); + + var package = VM.LoadExecutable(strm); + + strm.Close(); + + md = $"# {package.Name} Documentation\n"; + + each(var fn : package.Functions) + { + var fnName = ""; + for(var i = 0; i < fn.FunctionNameParts.Count; i++) + { + + if(i > 0) fnName += "."; + fnName += fn.FunctionNameParts[i]; + + } + fns.Add({ + Arguments=package.Chunks[i].Arguments, + Documentation=fn.Documentation, + Name=fnName + }); + } + } + else + { + md = "# CrossLang Runtime Documentation\n"; + var dict = {}; + var rEnv = VM.CreateEnvironment(dict); + rEnv.RegisterEverything(); + Crawl(dict,""); + } + + + each(var item : fns) + { + md += "```go\n"; + if(item.Documentation.Count > 0) + { + md += "/^ "; + md += item.Documentation.Replace(",",""); + md += " ^/\n"; + } + md += "func "; + md += item.Name; + md += "("; + for(var i = 0; i < item.Arguments.Count; i++) + { + if(i > 0) md += ", "; + md += item.Arguments[i]; + } + md += ");\n"; + + md += "```\n\n"; + } + + Console.WriteLine(md); +} \ No newline at end of file diff --git a/Tesses.CrossLang.Shell/src/main.tcross b/Tesses.CrossLang.Shell/src/main.tcross index c066b16..a8f1334 100644 --- a/Tesses.CrossLang.Shell/src/main.tcross +++ b/Tesses.CrossLang.Shell/src/main.tcross @@ -1,7 +1,6 @@ func main(args) { var dd = Tesses.CrossLang.Args(args); - if(dd.Arguments.Count > 0) { var commandName = dd.Arguments[0]; @@ -27,29 +26,98 @@ func main(args) { offline = true; } + if(flag == "help") + { + Console.WriteLine("USAGE: crosslang build [build-flags-and-options]"); + Console.WriteLine("FLAGS:"); + Console.WriteLine("offline: build with no internet (don't fetch files)"); + Console.WriteLine("help: this help"); + Console.WriteLine(); + Console.WriteLine("OPTIONS:"); + Console.WriteLine("conf=CONFIGSTRING: specify a conf string for compile_tool(s), is the property Config"); + return 0; + } + } + var conf = ""; + each(var option : dd.Options) + { + if(option.Key == "conf") + { + conf = option.Value; + } } var pm = Tesses.CrossLang.PackageManager(); pm.Offline = offline; var bt = Tesses.CrossLang.BuildTool(pm); + bt.Config = conf; bt.BuildProject(buildPath); } else if(commandName == "run") { var offline=false; var buildPath = "."; - + var nobuild=false; + var output=""; each(var flag : dd.Flags) { if(flag == "offline") { offline = true; } + else if(flag == "help") + { + Console.WriteLine("USAGE: crosslang run [run-flags-and-options] program-arguments..."); + Console.WriteLine("USAGE: crosslang run [run-flags-and-options] -- program-arguments-and-options..."); + Console.WriteLine("FLAGS:"); + Console.WriteLine("offline: build with no internet (don't fetch files)"); + Console.WriteLine("help: this help"); + Console.WriteLine("nobuild: don't build, just run"); + Console.WriteLine(); + Console.WriteLine("OPTIONS:"); + Console.WriteLine("conf=CONFIGSTRING: specify a conf string for compile_tool(s), is the property Config"); + return 0; + } + else if(flag == "nobuild") + { + nobuild=true; + } + } + var conf = ""; + each(var option : dd.Options) + { + if(option.Key == "conf") + { + conf = option.Value; + } + } + if(nobuild) + { + if(FS.Local.FileExists("config.json")) + { + var proj = Json.Decode(FS.ReadAllText(FS.Local, "config.json")); + var nameVer = $"{proj.name}-{proj.version}.crvm"; + var buildDir = TypeOf(proj.bin_directory) == "String" ? proj.bin_directory : "bin"; + + output = ./buildDir/nameVer; + if(!FS.Local.FileExists(output)) + { + Console.WriteLine($"ERROR: file {output} does not exist."); + } + } + else + { + Console.WriteLine("ERROR: could not find project."); + return 1; + } + } + else + { + var pm = Tesses.CrossLang.PackageManager(); + pm.Offline = offline; + var bt = Tesses.CrossLang.BuildTool(pm); + bt.Config = conf; + output = bt.BuildProject(buildPath).Output; } - var pm = Tesses.CrossLang.PackageManager(); - pm.Offline = offline; - var bt = Tesses.CrossLang.BuildTool(pm); - var output = bt.BuildProject(buildPath).Output; - var env = VM.CreateEnvironment({}); env.RegisterEverything(); env.LockRegister(); @@ -83,7 +151,7 @@ func main(args) Console.WriteLine("List of templates:"); each(var item : FS.Local.EnumeratePaths(dir)) { - Console.WriteLine(item.ChangeExtension().GetFileName()); + Console.WriteLine(Tesses.CrossLang.GetNameAndDescription(item)); } return 0; } @@ -178,6 +246,14 @@ func main(args) } } } + else if(commandName == "install-console") + { + //crosslang install-console + } + else if(commandName == "install-app") + { + //crosslang install-app + } else if(commandName == "install-template") { //crosslang install-template Tesses.CrossLang.Template.Console --version=1.0.0.0-prod @@ -185,10 +261,235 @@ func main(args) else if(commandName == "install-tool") { //crosslang install-tool Tesses.CrossLang.Tool.SomeTool --version=1.0.0.0-prod + var toolsDir = Path.FromString(Env.Config) / "Tesses" / "CrossLang" / "Tools"; + + var offline=false; + var buildPath = "."; + var nobuild=false; + var output=.; + each(var flag : dd.Flags) + { + if(flag == "offline") + { + offline = true; + } + else if(flag == "help") + { + Console.WriteLine("USAGE: crosslang install-tool [flags-and-options]"); + Console.WriteLine("USAGE: crosslang install-tool [PackageName] [flags-and-options]"); + Console.WriteLine("FLAGS:"); + Console.WriteLine("offline: build with no internet (don't fetch files)"); + Console.WriteLine("help: this help"); + Console.WriteLine("nobuild: don't build, just install (irrelevant if you specify a PackageName)"); + Console.WriteLine(); + Console.WriteLine("OPTIONS:"); + Console.WriteLine("conf=CONFIGSTRING: specify a conf string for compile_tool(s), is the property Config (irrelevant if you specify a PackageName)"); + Console.WriteLine("version=1.0.0.0-prod: specify the package version (irrelevant if you don't specify a PackageName)"); + Console.WriteLine(); + Console.WriteLine("ARGUMENTS:"); + Console.WriteLine("PackageName: the package name of a tool you want to download and install, if not specified we install the tool from the current directory"); + return 0; + } + else if(flag == "nobuild") + { + nobuild=true; + } + } + + if(dd.Arguments.Length == 1) + { + + var conf = ""; + each(var option : dd.Options) + { + if(option.Key == "conf") + { + conf = option.Value; + } + } + + if(FS.Local.FileExists("cross.json")) + { + var proj = Json.Decode(FS.ReadAllText(FS.Local,"cross.json")); + var name = TypeOf(proj.info.toolname) == "String" ? proj.info.toolname : proj.name; + + if(proj.info.type != "tool") + { + Console.WriteLine("The project is not a tool"); + return 1; + } + if(TypeOf(name) != "String") + { + Console.WriteLine("The tool does not have a name"); + return 1; + } + var toolDir = toolsDir / name; + FS.Local.CreateDirectory(toolDir); + var toolFile = toolDir / name + ".crvm"; + + if(nobuild) + { + var nameVer = $"{proj.name}-{proj.version}.crvm"; + var buildDir = TypeOf(proj.bin_directory) == "String" ? proj.bin_directory : "bin"; + + output = ./buildDir/nameVer; + if(!FS.Local.FileExists(output)) + { + Console.WriteLine($"ERROR: file {output} does not exist."); + return 1; + } + + } + else + { + var pm = Tesses.CrossLang.PackageManager(); + pm.Offline = offline; + var bt = Tesses.CrossLang.BuildTool(pm); + bt.Config = conf; + output = bt.BuildProject(buildPath).Output; + } + + func CopyCRVM(src,dest) + { + func copyFile(src,dest) + { + var _src = FS.Local.OpenFile(src,"rb"); + var _dest = FS.Local.OpenFile(dest, "wb"); + _src.CopyTo(_dest); + _src.Close(); + _dest.Close(); + Console.WriteLine($"{src} -> {dest}"); + } + if(FS.Local.FileExists(dest)) return; + copyFile(src,dest); + + + var srcStrm = FS.Local.OpenFile(src,"rb"); + var crvm = VM.LoadExecutable(srcStrm); + + srcStrm.Close(); + each(var dep : crvm.Dependencies) + { + var name = $"{dep.Name}-{dep.Version.ToString()}.crvm"; + CopyCRVM(src.GetParent()/name, dest.GetParent()/name); + } + } + CopyCRVM(output,toolFile); + return 0; + } + else + { + + Console.WriteLine("The current directory does not have a project"); + return 1; + } + } + } + else if(commandName == "console") + { + //crosslang console myfavoriteapp + } + else if(commandName == "tool") + { + + var dir = FS.MakeFull(Env.Config) / "Tesses" / "CrossLang" / "Tools"; + if(dd.Arguments.Length == 1) + { + Console.WriteLine("List of tools:"); + each(var item : FS.Local.EnumeratePaths(dir)) + { + Console.WriteLine(Tesses.CrossLang.GetNameAndDescription(item / item.GetFileName() + ".crvm")); + } + return 0; + } + } + else if(commandName == "tool-test") + { + var pm = Tesses.CrossLang.PackageManager(); + pm.Offline = false; + var bt = Tesses.CrossLang.BuildTool(pm); + + var proj=bt.BuildProject("."); + + var output = proj.Output; + + var env = VM.CreateEnvironment({}); + env.RegisterEverything(); + env.LockRegister(); + + env.LoadFileWithDependencies(FS.Local,output); + var myArgs = []; + for(var i = 1; i < dd.Arguments.Count; i++) + { + myArgs.Add(dd.Arguments[i]); + } + return env.GetDictionary().RunTool({ + Arguments=myArgs, + Options = dd.Options, + Flags = dd.Flags, + ToolName = proj.Info.toolname + }); } else if(commandName == "add-project") { //crosslang add-project /path/to/project + + if(dd.Arguments.Count > 1) + { + var dep = dd.Arguments[1]; + if(FS.Local.DirectoryExists(dep)) + { + var path = Path.FromString(dep) / "cross.json"; + var pathStr = FS.MakeFull(dep).CollapseRelativeParents().ToString(); + if(FS.Local.FileExists(path)) + { + if(FS.Local.FileExists("cross.json")) + { + var f = FS.ReadAllText(FS.Local,"cross.json"); + var json = Json.Decode(f); + if(TypeOf(json.project_dependencies) == "List") + { + each(var item : json.project_dependencies) + { + var _path = FS.MakeFull(item).CollapseRelativeParents().ToString(); + + if(_path == pathStr) + { + Console.WriteLine($"The project {dep} already exists in cross.json."); + + return 0; + } + } + json.project_dependencies.Add(dep); + } + else + { + json.project_dependencies = [dep]; + + } + Console.WriteLine($"Added project {dep} to cross.json."); + FS.WriteAllText(FS.Local, "cross.json", Json.Encode(json,true)); + return 0; + } + else + { + Console.WriteLine("The current directory does not have a project"); + return 1; + } + } + else + { + Console.WriteLine($"The project file {path} does not exist"); + return 1; + } + } + else + { + Console.WriteLine("The project directory does not exist"); + return 1; + } + } + return 1; } else if(commandName == "add-dependency") { @@ -198,5 +499,32 @@ func main(args) { //crosslang upload-package [PACKAGE_NAME] } + else if(commandName == "configdir") + { + Console.WriteLine(Tesses.CrossLang.ConfigDir); + } + } + else + { + each(var flag : dd.Flags) + { + if(flag == "version") + { + Console.WriteLine($"VM version: {VM.RuntimeVersion}"); + Console.WriteLine($"Shell version: {main.File.Version}"); + Console.WriteLine($"Args version: {Tesses.CrossLang.Args.File.Version}"); + Console.WriteLine($"BuildTool version: {Tesses.CrossLang.BuildTool.File.Version}"); + return 0; + } + } + Console.WriteLine($"USAGE: crosslang COMMAND [command-arguments]"); + Console.WriteLine("COMMANDS:"); + Console.WriteLine("new: create new project"); + Console.WriteLine("build: build a project"); + Console.WriteLine("run: run a project"); + Console.WriteLine("configdir: print the config directory"); + return 0; + } + return 0; } diff --git a/Tesses.CrossLang.Std/cross.json b/Tesses.CrossLang.Std/cross.json new file mode 100644 index 0000000..256df31 --- /dev/null +++ b/Tesses.CrossLang.Std/cross.json @@ -0,0 +1,7 @@ +{ + "info": { + "type": "lib" + }, + "version": "1.0.0.0-prod", + "name": "Tesses.CrossLang.Std" +} \ No newline at end of file diff --git a/Tesses.CrossLang.Std/src/time.tcross b/Tesses.CrossLang.Std/src/time.tcross new file mode 100644 index 0000000..dedeff1 --- /dev/null +++ b/Tesses.CrossLang.Std/src/time.tcross @@ -0,0 +1,21 @@ +func Time.Date.Create(year,month,day,hour,minute,second,timezone,hasDST) +{ + +} + +func Time.Date.FromUnix(timeStamp) +{ + var seconds = (timeStamp % 60).Abs(); + var min = ((timeStamp / 60) % 60).Abs(); + var hour = ((timeStamp / 3600) % 24).Abs(); + var year = ((timeStamp / 31557600)); + var daysSince1970 = (timeStamp / 86400); + + + + return Time.Date.Create(,second); +} +func Time.Date.getNow() +{ + return Time.Date.FromUnix(Time.Now); +} \ No newline at end of file diff --git a/crosslang_shell_archive_maker/src/main.tcross b/crosslang_shell_archive_maker/src/main.tcross index 161291b..74f6366 100644 --- a/crosslang_shell_archive_maker/src/main.tcross +++ b/crosslang_shell_archive_maker/src/main.tcross @@ -52,6 +52,7 @@ func create_archive() copyFile("Templates/lib/bin/Tesses.CrossLang.Template.Library-1.0.0.0-prod.crvm", templates / "lib.crvm"); copyFile("Templates/template/bin/Tesses.CrossLang.Template.Template-1.0.0.0-prod.crvm", templates / "template.crvm"); copyFile("Templates/web/bin/Tesses.CrossLang.Template.Website-1.0.0.0-prod.crvm", templates / "web.crvm"); + copyFile("Templates/tool/bin/Tesses.CrossLang.Template.Tool-1.0.0.0-prod.crvm", templates / "tool.crvm"); var packageCache = r / "PackageCache"; tmpFS.CreateDirectory(packageCache); diff --git a/crosslang_shell_archive_maker/tmp/PackageCache/Tesses.CrossLang.BuildEssentials/1.0.0.0-prod b/crosslang_shell_archive_maker/tmp/PackageCache/Tesses.CrossLang.BuildEssentials/1.0.0.0-prod index 18c589ed4eb18e1c149276aac5101f8295a5392d..9fc76c208788dfde755131ef52094117ae4f5d5e 100644 GIT binary patch literal 13184 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 VeKpn7G^x#Wq2fzyMoDM#{{V2QO;rE@ diff --git a/script.sh b/script.sh index c821693..bc9259b 100755 --- a/script.sh +++ b/script.sh @@ -8,5 +8,6 @@ crossvm ./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-prod.crvm bu crossvm ./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-prod.crvm build Templates/template crossvm ./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-prod.crvm build Templates/lib crossvm ./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-prod.crvm build Templates/compiletool +crossvm ./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-prod.crvm build Templates/tool crossvm ./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-prod.crvm build crosslang_shell_archive_maker