Adding some documentation to crosslang shell

This commit is contained in:
2025-03-28 22:06:34 -05:00
parent 8811a8c9c4
commit 6c5772c6c8
25 changed files with 1167 additions and 271 deletions

View File

@@ -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;

View File

@@ -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

View File

@@ -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
});
}
}
}
};
}

View File

@@ -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}";
}

View File

@@ -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);