mirror of
https://github.com/autc04/Retro68.git
synced 2024-11-23 00:34:22 +00:00
Rez: command line options
This commit is contained in:
parent
2b64cb707d
commit
127db48a26
@ -19,7 +19,7 @@ cmake_minimum_required(VERSION 2.8)
|
||||
|
||||
set(CMAKE_CXX_FLAGS "--std=c++11")
|
||||
|
||||
find_package(Boost COMPONENTS wave filesystem system thread regex)
|
||||
find_package(Boost COMPONENTS wave filesystem system thread regex program_options)
|
||||
|
||||
|
||||
find_package(BISON REQUIRED)
|
||||
|
@ -2,8 +2,13 @@
|
||||
#include <iostream>
|
||||
#include "ResourceDefinitions.h"
|
||||
|
||||
ResourceCompiler::ResourceCompiler(TypeDefinitionPtr type, CompoundExprPtr body)
|
||||
: typeDefinition(type), body(body), currentOffset(0), currentField(nullptr)
|
||||
ResourceCompiler::ResourceCompiler(
|
||||
TypeDefinitionPtr type, CompoundExprPtr body, bool verboseFlag)
|
||||
: typeDefinition(type),
|
||||
body(body),
|
||||
currentOffset(0),
|
||||
currentField(nullptr),
|
||||
verboseFlag(verboseFlag)
|
||||
{
|
||||
|
||||
}
|
||||
@ -15,7 +20,8 @@ std::string ResourceCompiler::resourceData()
|
||||
|
||||
void ResourceCompiler::write(int nBits, int value)
|
||||
{
|
||||
std::cout << "[" << nBits << " bits] = " << std::hex << value << std::dec << std::endl;
|
||||
if(verboseFlag)
|
||||
std::cout << "[" << nBits << " bits] = " << std::hex << value << std::dec << std::endl;
|
||||
|
||||
unsigned mask = 1 << (nBits-1);
|
||||
|
||||
@ -41,7 +47,6 @@ ExprPtr ResourceCompiler::lookupIdentifier(std::string name, const Subscripts &s
|
||||
{
|
||||
if(ExprPtr val = currentField->lookupNamedValue(name))
|
||||
{
|
||||
std::cout << "current field: " << name << " found.";
|
||||
return val;
|
||||
}
|
||||
}
|
||||
@ -50,7 +55,7 @@ ExprPtr ResourceCompiler::lookupIdentifier(std::string name, const Subscripts &s
|
||||
if(p != labelValues.end())
|
||||
return p->second;
|
||||
|
||||
std::cout << "ID lookup failed: " << name << std::endl;
|
||||
std::cerr << "ID lookup failed: " << name << std::endl;
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
@ -62,15 +67,15 @@ void ResourceCompiler::defineLabel(const std::string &name)
|
||||
|
||||
void ResourceCompiler::compile()
|
||||
{
|
||||
std::cout << "(first pass)\n";
|
||||
if(verboseFlag) std::cout << "(first pass)\n";
|
||||
currentOffset = 0;
|
||||
data.clear();
|
||||
typeDefinition->compile(body, this, true);
|
||||
std::cout << "(second pass)\n";
|
||||
if(verboseFlag) std::cout << "(second pass)\n";
|
||||
currentOffset = 0;
|
||||
data.clear();
|
||||
typeDefinition->compile(body, this, false);
|
||||
std::cout << "(done)\n";
|
||||
if(verboseFlag) std::cout << "(done)\n";
|
||||
|
||||
}
|
||||
|
||||
|
@ -32,10 +32,11 @@ class ResourceCompiler
|
||||
Subscripts currentSubscripts;
|
||||
|
||||
std::vector<unsigned char> data;
|
||||
bool verboseFlag;
|
||||
|
||||
void beginArrayScope(std::string& arrayName, int index);
|
||||
public:
|
||||
ResourceCompiler(TypeDefinitionPtr type, CompoundExprPtr body);
|
||||
ResourceCompiler(TypeDefinitionPtr type, CompoundExprPtr body, bool verboseFlag);
|
||||
|
||||
std::string resourceData();
|
||||
|
||||
|
92
Rez/Rez.cc
92
Rez/Rez.cc
@ -1,6 +1,7 @@
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
|
||||
#include "boost/program_options.hpp"
|
||||
#include "boost/filesystem.hpp"
|
||||
#include "boost/filesystem/fstream.hpp"
|
||||
|
||||
#include "RezParser.generated.hh"
|
||||
#include "RezLexer.h"
|
||||
@ -9,24 +10,83 @@
|
||||
#include "ResourceFiles.h"
|
||||
#include "BinaryIO.h"
|
||||
|
||||
int main()
|
||||
{
|
||||
//RezLexer lexer("/home/wolfgang/Projects/Retro68/RIncludes/Types.r");
|
||||
RezLexer lexer("/home/wolfgang/Projects/Retro68/Rez/Test.r");
|
||||
RezWorld world;
|
||||
RezParser parser(lexer, world);
|
||||
namespace po = boost::program_options;
|
||||
namespace fs = boost::filesystem;
|
||||
|
||||
parser.parse();
|
||||
static po::options_description desc;
|
||||
|
||||
static void usage()
|
||||
{
|
||||
std::cerr << "Usage: " << "Rez [options] input-file\n";
|
||||
std::cerr << desc << std::endl;
|
||||
}
|
||||
|
||||
int main(int argc, const char *argv[])
|
||||
{
|
||||
desc.add_options()
|
||||
("help,h", "show this help message")
|
||||
("output,o", po::value<std::string>()->default_value("rez.output.rsrc"), "output file")
|
||||
("type,t", po::value<std::string>()->default_value("rsrc"), "output file finder type code")
|
||||
("creator,c", po::value<std::string>()->default_value("RSED"), "output file finder creator code")
|
||||
("debug,d", "debug logging")
|
||||
;
|
||||
po::options_description hidden, alldesc;
|
||||
hidden.add_options()
|
||||
("input", po::value<std::vector<std::string>>(), "input file" )
|
||||
;
|
||||
alldesc.add(desc).add(hidden);
|
||||
|
||||
po::variables_map options;
|
||||
try
|
||||
{
|
||||
std::ofstream dataOut("test.rsrc");
|
||||
system("mkdir -p .rsrc");
|
||||
std::ofstream rsrcOut(".rsrc/test.rsrc");
|
||||
auto parsed = po::command_line_parser(argc, argv)
|
||||
.options(alldesc)
|
||||
.positional(po::positional_options_description().add("input", -1))
|
||||
.style(po::command_line_style::default_style |
|
||||
po::command_line_style::allow_long_disguise)
|
||||
.run();
|
||||
|
||||
po::store(parsed, options);
|
||||
}
|
||||
catch(po::error& e)
|
||||
{
|
||||
std::cerr << "ERROR: " << e.what() << std::endl << std::endl;
|
||||
usage();
|
||||
return 1;
|
||||
}
|
||||
|
||||
po::notify(options);
|
||||
|
||||
if(options.count("help") || !options.count("input"))
|
||||
{
|
||||
usage();
|
||||
return 0;
|
||||
}
|
||||
|
||||
RezWorld world;
|
||||
|
||||
if(options.count("debug"))
|
||||
world.verboseFlag = true;
|
||||
|
||||
for(std::string fn : options["input"].as<std::vector<std::string>>())
|
||||
{
|
||||
RezLexer lexer(fn);
|
||||
RezParser parser(lexer, world);
|
||||
parser.parse();
|
||||
}
|
||||
|
||||
std::string outfile = options["output"].as<std::string>();
|
||||
{
|
||||
fs::path dataPath(outfile);
|
||||
fs::create_directory(dataPath.parent_path() / ".rsrc");
|
||||
fs::create_directory(dataPath.parent_path() / ".finf");
|
||||
fs::ofstream dataOut(dataPath);
|
||||
fs::ofstream rsrcOut(dataPath.parent_path() / ".rsrc" / dataPath.filename());
|
||||
fs::ofstream finfOut(dataPath.parent_path() / ".finf" / dataPath.filename());
|
||||
|
||||
world.getResources().writeFork(rsrcOut);
|
||||
system("mkdir -p .finf");
|
||||
std::ofstream finfOut(".finf/test.rsrc");
|
||||
ostype(finfOut, "rsrc");
|
||||
ostype(finfOut, "RSED");
|
||||
ostype(finfOut, options["type"].as<std::string>());
|
||||
ostype(finfOut, options["creator"].as<std::string>());
|
||||
for(int i = 8; i < 32; i++)
|
||||
byte(finfOut, 0);
|
||||
}
|
||||
|
@ -113,7 +113,6 @@ RezLexer::WaveToken RezLexer::nextWave()
|
||||
else
|
||||
{
|
||||
WaveToken tok = *pImpl->iter++;
|
||||
std::cout << tok.get_value();
|
||||
return tok;
|
||||
}
|
||||
}
|
||||
|
@ -167,9 +167,9 @@ type_definition : "type" type_spec
|
||||
world.fieldLists.push(td);
|
||||
}
|
||||
"{" field_definitions "}"
|
||||
{ world.fieldLists.pop(); std::cout << "TYPE " << $2 << std::endl; }
|
||||
{ world.fieldLists.pop(); if(world.verboseFlag) std::cout << "TYPE " << $2 << std::endl; }
|
||||
| "type" type_spec "as" type_spec
|
||||
{ std::cout << "TYPE " << $2 << std::endl; }
|
||||
{ if(world.verboseFlag) std::cout << "TYPE " << $2 << std::endl; }
|
||||
;
|
||||
|
||||
%type <ResType> res_type;
|
||||
|
@ -5,6 +5,7 @@
|
||||
#include <iostream>
|
||||
|
||||
RezWorld::RezWorld()
|
||||
: verboseFlag(false)
|
||||
{
|
||||
}
|
||||
|
||||
@ -27,9 +28,10 @@ TypeDefinitionPtr RezWorld::getTypeDefinition(ResType type, int id)
|
||||
|
||||
void RezWorld::addResource(ResType type, int id, CompoundExprPtr body)
|
||||
{
|
||||
std::cout << "RESOURCE " << type << "(" << id << ")" << std::endl;
|
||||
if(verboseFlag)
|
||||
std::cout << "RESOURCE " << type << "(" << id << ")" << std::endl;
|
||||
TypeDefinitionPtr def = getTypeDefinition(type, id);
|
||||
ResourceCompiler compiler(def, body);
|
||||
ResourceCompiler compiler(def, body, verboseFlag);
|
||||
compiler.compile();
|
||||
|
||||
resources.addResource(Resource(type, id, compiler.resourceData()));
|
||||
|
@ -26,6 +26,8 @@ public:
|
||||
void addResource(ResType type, int id, CompoundExprPtr body);
|
||||
|
||||
Resources& getResources() { return resources; }
|
||||
|
||||
bool verboseFlag;
|
||||
};
|
||||
|
||||
|
||||
|
11
Rez/Test.r
11
Rez/Test.r
@ -3,12 +3,12 @@
|
||||
|
||||
*/
|
||||
|
||||
//#include "/home/wolfgang/Projects/Retro68/CExamples/Sample.r"
|
||||
#include "/home/wolfgang/Projects/Retro68/CExamples/Sample.r"
|
||||
|
||||
type 'TEST' {
|
||||
integer zero, one, two, answer = 42, missed;
|
||||
longint;
|
||||
//integer = (after - before) / 32;
|
||||
integer = (after - before) / 8;
|
||||
integer = $$CountOf(foo);
|
||||
before:
|
||||
array foo {
|
||||
@ -16,6 +16,7 @@ type 'TEST' {
|
||||
integer;
|
||||
integer;
|
||||
};
|
||||
string;
|
||||
after:
|
||||
;
|
||||
};
|
||||
@ -23,6 +24,10 @@ type 'TEST' {
|
||||
resource 'TEST' (128) {
|
||||
answer,
|
||||
0x1234,
|
||||
{ 1, 2; 3, 4; }
|
||||
{ 1, 2; 3, 4; },
|
||||
"Hello, "
|
||||
"world: "
|
||||
$"Abcd 1234";
|
||||
};
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user