Files
CMLeonOS/interpreter/Branswe.cs

563 lines
23 KiB
C#
Raw Normal View History

2026-01-31 23:36:50 +08:00
using Cosmos.Core;
using Cosmos.HAL;
using Cosmos.HAL.BlockDevice;
using Cosmos.System;
using Cosmos.System.FileSystem;
using Cosmos.System.FileSystem.VFS;
using Cosmos.System.Graphics;
using Cosmos.System.Network;
using System;
using System.Collections.Generic;
using System.Diagnostics.Metrics;
using System.Drawing;
using System.IO;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Xml.Linq;
using Console = System.Console;
using Sys = Cosmos.System;
public static class Branswe
2026-02-01 18:05:54 +08:00
//Branswe<77><65>ѭMIT<49><54><EFBFBD><EFBFBD>֤<EFBFBD><D6A4>
2026-01-31 23:36:50 +08:00
{
private static string varlib = "";
private static string geted = "";
private static string methods = "";
public static void Run(string Code)
{
//<2F><>ʼ<EFBFBD><CABC>
string[] codelines = Code.Split("\n");
2026-02-01 18:05:54 +08:00
long Codelength = codelines.Length;
2026-01-31 23:36:50 +08:00
2026-02-01 18:05:54 +08:00
for (long coderun = 0; coderun < Codelength; coderun++)
2026-01-31 23:36:50 +08:00
{
string line = codelines[coderun];
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>к<EFBFBD><D0BA><EFBFBD> # <20><>ͷ<EFBFBD><CDB7>ע<EFBFBD><D7A2>
if (string.IsNullOrWhiteSpace(line) || line.TrimStart().StartsWith("#"))
{
continue;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD><EFBFBD>ո<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
switch (line.Split(" ")[0])
{
case "method":
2026-02-01 18:05:54 +08:00
{
string rest = line.Substring(6).Trim();
int arrowIndex = rest.IndexOf("<<");
string varPart = rest.Substring(0, arrowIndex).Trim();
string codePart = rest.Substring(arrowIndex + 2).Trim();
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD> varPart <20>DZ<EFBFBD><C7B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>ֵ
if (!varPart.Contains(" "))
{
Branswe.Run("ref getvar " + varPart);
if (!string.IsNullOrEmpty(geted)) varPart = geted;
}
// <20><><EFBFBD> codePart <20>DZ<EFBFBD><C7B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>ֵ
if (!codePart.Contains(" "))
{
Branswe.Run("ref getvar " + codePart);
if (!string.IsNullOrEmpty(geted)) codePart = geted;
}
methods += "\uE001" + varPart + "\uE002" + codePart;
break;
}
2026-01-31 23:36:50 +08:00
case "diskfile":
2026-02-01 18:05:54 +08:00
{
switch (line.Split(" ")[1])
{
/*case "read":
{
Branswe.Run("ref getvar " + line.Split(" ", 5)[2]);
var get0 = geted;
switch (line.Split(" ")[3])
{
case "to":
{
Branswe.Run("ref getvar " + line.Split(" ", 5)[4]);
var get1 = geted;
Branswe.Run("var(text) " + get1 + " = " + VFSManager.GetFile(get0));
break;
}
}
break;
}*/
case "reg":
{
VFSBase vfs = new CosmosVFS();
VFSManager.RegisterVFS(vfs);
break;
}
case "create":
{
switch (line.Split(" ")[2])
{
case "file":
{
Branswe.Run("ref getvar " + line.Split(" ", 4)[3]);
var get = geted;
VFSManager.CreateFile(get);
break;
}
case "dir":
{
Branswe.Run("ref getvar " + line.Split(" ", 4)[3]);
var get = geted;
VFSManager.CreateDirectory(get);
break;
}
}
break;
}
case "write":
{
Branswe.Run("ref getvar " + line.Split(" ", 5)[2]);
var get0 = geted;
switch (line.Split(" ", 5)[3])
{
case "to":
{
Branswe.Run("ref getvar " + line.Split(" ", 5)[4]);
var get1 = geted;
File.WriteAllText(get0, get1);
break;
}
}
}
break;
}
}
2026-01-31 23:36:50 +08:00
break;
case "rstr": //rstr=Read String To Run
2026-02-01 18:05:54 +08:00
{
var parts = line.Split(" ", 2);
Branswe.Run("ref getvar " + parts[1]);
var code = geted;
for (long i = 0; i < code.Split("\\n").Length; i++)
{
Branswe.Run(code.Split("\\n")[i]);
}
break;
}
2026-01-31 23:36:50 +08:00
case "var()":
{
var parts = line.Split(" ", 4);
if (parts.Length == 3 && parts[2] == "rm")
{
string varName = parts[1];
string[] lines = varlib.Split('\n');
string newVarlib = "";
foreach (string varlibLine in lines)
{
if (!string.IsNullOrEmpty(varlibLine))
{
if (!varlibLine.StartsWith(varName + "\uE001"))
{
newVarlib = newVarlib + "\n" + varlibLine;
}
}
}
varlib = newVarlib;
}
else
{
switch (parts[2])
{
case "=+":
{
Branswe.Run("ref getvar " + parts[1]);
2026-02-01 18:05:54 +08:00
long wc0 = long.Parse(geted);
2026-01-31 23:36:50 +08:00
Branswe.Run("ref getvar " + parts[3]);
2026-02-01 18:05:54 +08:00
long wc1 = long.Parse(geted);
long calced = wc0 + wc1;
2026-01-31 23:36:50 +08:00
Branswe.Run("var(text) " + parts[1] + " = " + calced);
break;
}
case "=-":
{
Branswe.Run("ref getvar " + parts[1]);
2026-02-01 18:05:54 +08:00
long wc0 = long.Parse(geted);
2026-01-31 23:36:50 +08:00
Branswe.Run("ref getvar " + parts[3]);
2026-02-01 18:05:54 +08:00
long wc1 = long.Parse(geted);
long calced = wc0 - wc1;
2026-01-31 23:36:50 +08:00
Branswe.Run("var(text) " + parts[1] + " = " + calced);
break;
}
case "=*":
{
Branswe.Run("ref getvar " + parts[1]);
2026-02-01 18:05:54 +08:00
long wc0 = long.Parse(geted);
2026-01-31 23:36:50 +08:00
Branswe.Run("ref getvar " + parts[3]);
2026-02-01 18:05:54 +08:00
long wc1 = long.Parse(geted);
long calced = wc0 * wc1;
2026-01-31 23:36:50 +08:00
Branswe.Run("var(text) " + parts[1] + " = " + calced);
break;
}
case "=/":
{
Branswe.Run("ref getvar " + parts[1]);
2026-02-01 18:05:54 +08:00
long wc0 = long.Parse(geted);
2026-01-31 23:36:50 +08:00
Branswe.Run("ref getvar " + parts[3]);
2026-02-01 18:05:54 +08:00
long wc1 = long.Parse(geted);
long calced = wc0 / wc1;
2026-01-31 23:36:50 +08:00
Branswe.Run("var(text) " + parts[1] + " = " + calced);
break;
}
case "=":
{
Branswe.Run("ref getvar " + parts[3]);
Branswe.Run("var(text) " + parts[1] + " = " + geted);
break;
}
}
}
break;
}
case "var(text)":
{
var parts = line.Split(" ", 4);
switch (parts[2])
{
case "=":
{
Branswe.Run("var() " + parts[1] + " rm");
varlib = varlib + "\n" + parts[1] + "\uE001" + parts[3];
break;
}
}
break;
}
case "conshowl":
{
Branswe.Run("ref getvar " + line.Split(" ")[1]);
Console.WriteLine(geted);
break;
}
case "ref":
{
string[] parts = line.Split(" ");
if (parts.Length < 2) break;
switch (parts[1])
{
case "mousex":
2026-02-01 18:05:54 +08:00
Branswe.Run("var(text) [] = " + MouseManager.X);
break;
case "mousey":
Branswe.Run("var(text) [] = " + MouseManager.Y);
break;
case "screenx":
Branswe.Run("var(text) [] = " + Console.WindowWidth);
break;
case "screeny":
Branswe.Run("var(text) [] = " + Console.WindowHeight);
break;
case "concolour-b":
Branswe.Run("var(text) [] = " + Console.BackgroundColor);
break;
case "concolour-f":
Branswe.Run("var(text) [] = " + Console.ForegroundColor);
break;
2026-01-31 23:36:50 +08:00
case "getalldisks":
{
Branswe.Run("var(text) [] = " + VFSManager.GetDisks().ToArray());
break;
}
2026-02-01 18:05:54 +08:00
2026-01-31 23:36:50 +08:00
case "getvar":
{
string varName = parts[2];
string value = "";
string[] lines = varlib.Split('\n');
foreach (string lineInLib in lines)
{
if (!string.IsNullOrEmpty(lineInLib) &&
lineInLib.StartsWith(varName + "\uE001"))
{
value = lineInLib.Substring(varName.Length + 1);
}
}
//CSharp:
geted = value;
//Branswe:
Branswe.Run("var(text) [] = " + value);
break;
}
}
break;
}
case "conshow":
{
Branswe.Run("ref getvar " + line.Split(" ")[1]);
Console.Write(geted);
break;
}
case "coninput":
{
Branswe.Run("var(text) " + line.Split(" ")[1] + " = " + Console.ReadLine());
break;
}
case "conbeep":
{
Console.Beep(); //<2F><><EFBFBD><EFBFBD>C#<23><>beep
break;
}
case "sleep":
{
Branswe.Run("ref getvar " + line.Split(" ")[1]);
2026-02-01 18:05:54 +08:00
Thread.Sleep(TimeSpan.FromMilliseconds(long.Parse(geted))); //<2F><><EFBFBD><EFBFBD>C# Threading<6E><67>Sleep
2026-01-31 23:36:50 +08:00
break;
}
case "loop":
{
var parts = line.Split(" ");
if (parts[1] == "<<")
{
while (true)
{
Branswe.Run("rstr " + parts[2]);
}
}
break;
}
case "end":
{
throw new Exception("\uE001");
}
case "power":
2026-02-01 18:05:54 +08:00
{
switch (line.Split(" ")[1])
{
case "off":
{
ACPI.Shutdown();
CPU.Halt();
break;
}
case "reboot":
{
ACPI.Reboot();
CPU.Reboot();
break;
}
}
break;
}
2026-01-31 23:36:50 +08:00
case "decide":
{
var parts = line.Split(" ");
bool IsRight;
Branswe.Run("ref getvar " + parts[1]);
var left = geted;
Branswe.Run("ref getvar " + parts[3]);
var right = geted;
switch (parts[2])
{
case "==":
{
if (left == right)
{
IsRight = true;
}
else
{
IsRight = false;
}
break;
}
case "!=":
{
if (left == right)
{
IsRight = false;
}
else
{
IsRight = true;
}
break;
}
case ">":
{
if (long.Parse(left) > long.Parse(right))
{
IsRight = true;
}
else
{
IsRight = false;
}
break;
}
case "<":
{
if (long.Parse(left) < long.Parse(right))
{
IsRight = true;
}
else
{
IsRight = false;
}
break;
}
case ">=":
{
if (long.Parse(left) >= long.Parse(right))
{
IsRight = true;
}
else
{
IsRight = false;
}
break;
}
case "<=":
{
if (long.Parse(left) <= long.Parse(right))
{
IsRight = true;
}
else
{
IsRight = false;
}
break;
}
default:
{
IsRight = false;
break;
}
}
if (IsRight)
{
Branswe.Run("var(text) [] = \uE003");
}
else
{
Branswe.Run("var() [] rm");
}
break;
}
case "if":
{
//if <bool> then <true_code> else <false_code>
//Split: 0 1 2 3 4 5
//Length:6
var parts = line.Split(" ");
Branswe.Run("ref getvar " + parts[1]); //bool
var ifask = geted;
if (ifask == "\uE003")
{
if (parts[2] == "then")
{
Branswe.Run("rstr " + parts[3]); //then
}
}
else if (parts.Length >= 6)
{
if (parts[4] == "else")
{
Branswe.Run("rstr " + parts[5]); //else
}
}
break;
}
case "concls":
{
Console.Clear();
break;
}
default:
{
var methodEntries = methods.Split('\uE001', StringSplitOptions.RemoveEmptyEntries);
2026-02-01 18:05:54 +08:00
for (long i = 0; i < methodEntries.Length; i++)
2026-01-31 23:36:50 +08:00
{
var parts = methodEntries[i].Split('\uE002');
if (parts.Length < 2) continue;
2026-02-01 18:05:54 +08:00
string varPart = parts[0]; //keep spaces as is
string codeTemplate = parts[1]; //keep spaces
2026-01-31 23:36:50 +08:00
var firstToken = varPart.Split(' ')[0];
Branswe.Run("ref getvar " + firstToken);
2026-02-01 18:05:54 +08:00
string methodName = geted; //no .TrimEnd('(').Trim()
2026-01-31 23:36:50 +08:00
if (line.StartsWith(methodName))
{
2026-02-01 18:05:54 +08:00
string args = line.Substring(methodName.Length); //keep spaces
Branswe.Run("ref getvar " + args);
string argValue = geted; //value may contain spaces
2026-01-31 23:36:50 +08:00
string finalCode = codeTemplate;
var varTokens = varPart.Split(' ', StringSplitOptions.RemoveEmptyEntries);
2026-02-01 18:05:54 +08:00
for (long j = 1; j < varTokens.Length; j++)
2026-01-31 23:36:50 +08:00
{
var token = varTokens[j];
if (token == "[]")
{
2026-02-01 18:05:54 +08:00
finalCode = finalCode.Replace("[]", argValue);
2026-01-31 23:36:50 +08:00
}
else
{
Branswe.Run("ref getvar " + token);
finalCode = finalCode.Replace(token, geted);
}
}
Branswe.Run(finalCode);
2026-02-01 18:05:54 +08:00
break;
2026-01-31 23:36:50 +08:00
}
}
2026-02-01 15:21:17 +08:00
break;
}
2026-01-31 23:36:50 +08:00
}
}
}
}