mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-10 12:32:20 +02:00
159 lines
3.8 KiB
Beef
159 lines
3.8 KiB
Beef
using System;
|
|
using System.IO;
|
|
|
|
namespace DocPrep
|
|
{
|
|
class Program
|
|
{
|
|
[StdCall, CLink]
|
|
static extern void* BfSystem_Create();
|
|
|
|
[StdCall, CLink]
|
|
static extern void BfSystem_Delete(void* bfSystem);
|
|
|
|
[StdCall, CLink]
|
|
static extern void* BfSystem_CreateParser(void* bfSystem, void* bfProject);
|
|
|
|
[StdCall, CLink]
|
|
static extern void* BfSystem_CreatePassInstance(void* bfSystem);
|
|
|
|
[StdCall, CLink]
|
|
static extern void BfPassInstance_Delete(void* bfSystem);
|
|
|
|
[StdCall, CLink]
|
|
static extern void BfSystem_DeleteParser(void* bfSystem, void* bfParser);
|
|
|
|
[StdCall, CLink]
|
|
static extern void BfParser_SetSource(void* bfParser, char8* data, int32 length, char8* fileName);
|
|
|
|
[StdCall, CLink]
|
|
static extern bool BfParser_Parse(void* bfParser, void* bfPassInstance, bool compatMode);
|
|
|
|
[StdCall, CLink]
|
|
static extern bool BfParser_Reduce(void* bfParser, void* bfPassInstance);
|
|
|
|
[StdCall, CLink]
|
|
static extern char8* BfParser_Format(void* bfParser, int32 formatEnd, int32 formatStart, out int32* outCharMapping);
|
|
|
|
[StdCall, CLink]
|
|
static extern char8* BfParser_DocPrep(void* bfParser);
|
|
|
|
/*[StdCall, CLink]
|
|
static extern char8* BfParser_Prep*/
|
|
|
|
[StdCall, CLink]
|
|
static extern void* BfSystem_CreateProject(void* bfSystem, char8* projectName);
|
|
|
|
String mSrcDirPath;
|
|
String mDestDirPath;
|
|
|
|
void* mSystem;
|
|
void* mProject;
|
|
|
|
this()
|
|
{
|
|
mSystem = BfSystem_Create();
|
|
mProject = BfSystem_CreateProject(mSystem, "main");
|
|
}
|
|
|
|
void GenFile(String relFilePath)
|
|
{
|
|
String inFilePath = scope .();
|
|
inFilePath.Append(mSrcDirPath, "/", relFilePath);
|
|
|
|
String outFilePath = scope .();
|
|
outFilePath.Append(mDestDirPath, "/", relFilePath);
|
|
|
|
String text = scope .();
|
|
File.ReadAllText(inFilePath, text, false);
|
|
|
|
void* parser = BfSystem_CreateParser(mSystem, mProject);
|
|
BfParser_SetSource(parser, text.Ptr, (.)text.Length, inFilePath);
|
|
|
|
void* passInstance = BfSystem_CreatePassInstance(mSystem);
|
|
BfParser_Parse(parser, passInstance, false);
|
|
BfParser_Reduce(parser, passInstance);
|
|
|
|
char8* docText = BfParser_DocPrep(parser);
|
|
|
|
String outDirPath = scope .();
|
|
Path.GetDirectoryPath(outFilePath, outDirPath);
|
|
Directory.CreateDirectory(outDirPath);
|
|
|
|
File.WriteAllText(outFilePath, .(docText));
|
|
|
|
BfSystem_DeleteParser(mSystem, parser);
|
|
}
|
|
|
|
void AddFiles(String relDirPath)
|
|
{
|
|
String dirPath = scope .(mSrcDirPath);
|
|
dirPath.Append("/");
|
|
dirPath.Append(relDirPath);
|
|
|
|
for (let val in Directory.EnumerateDirectories(dirPath))
|
|
{
|
|
String subDirPath = scope .();
|
|
subDirPath.Append(relDirPath, "/");
|
|
val.GetFileName(subDirPath);
|
|
AddFiles(subDirPath);
|
|
}
|
|
|
|
for (let val in Directory.EnumerateFiles(dirPath))
|
|
{
|
|
String relFilePath = scope .();
|
|
relFilePath.Append(relDirPath, "/");
|
|
val.GetFileName(relFilePath);
|
|
GenFile(relFilePath);
|
|
}
|
|
}
|
|
|
|
bool TestDestPath(String relDirPath)
|
|
{
|
|
String dirPath = scope .(mDestDirPath);
|
|
dirPath.Append("/");
|
|
dirPath.Append(relDirPath);
|
|
|
|
for (let val in Directory.EnumerateDirectories(dirPath))
|
|
{
|
|
String subDirPath = scope .();
|
|
subDirPath.Append(relDirPath, "/");
|
|
val.GetFileName(subDirPath);
|
|
if (!TestDestPath(subDirPath))
|
|
return false;
|
|
}
|
|
|
|
for (let val in Directory.EnumerateFiles(dirPath))
|
|
{
|
|
String filePath = scope .();
|
|
val.GetFilePath(filePath);
|
|
|
|
if (!filePath.EndsWith(".bf"))
|
|
{
|
|
Console.Error.WriteLine("Dest past not empty. Invalid file found: {}", filePath);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public static int32 Main(String[] args)
|
|
{
|
|
Program pg = scope .();
|
|
pg.mSrcDirPath = args[0];
|
|
pg.mDestDirPath = args[1];
|
|
if (!pg.TestDestPath(""))
|
|
return 1;
|
|
if (Directory.DelTree(pg.mDestDirPath) case .Err)
|
|
{
|
|
Console.Error.Write("Failed to clear dest path");
|
|
return 2;
|
|
}
|
|
|
|
pg.AddFiles("");
|
|
|
|
return 0;
|
|
}
|
|
}
|
|
}
|