Work on xml-to-html converter for register documentation

This commit is contained in:
Xavier Del Campo Romero 2020-09-19 03:42:03 +02:00
parent 0e001bd3d3
commit dc0bb4c93c
9 changed files with 209 additions and 0 deletions

6
.gitmodules vendored Normal file
View File

@ -0,0 +1,6 @@
[submodule "hw_html/xmlParser"]
path = hw_html/xmlParser
url = https://github.com/lookup69/xmlParser
[submodule "hw_html/CTML"]
path = hw_html/CTML
url = https://github.com/tinfoilboy/CTML

10
hw_html/CMakeLists.txt Normal file
View File

@ -0,0 +1,10 @@
cmake_minimum_required(VERSION 3.0)
project(hw_html CXX)
add_definitions(-g)
add_executable(${PROJECT_NAME} html.cpp main.cpp mcureg.cpp)
add_library(xmlParser xmlParser/xmlParser.cpp)
add_subdirectory(CTML)
target_include_directories(xmlParser PUBLIC xmlParser)
target_link_libraries(${PROJECT_NAME} PRIVATE xmlParser CTML)
target_include_directories(${PROJECT_NAME} PRIVATE .)
target_compile_options(${PROJECT_NAME} PRIVATE -Wall -std=c++17)

1
hw_html/CTML Submodule

@ -0,0 +1 @@
Subproject commit 45cf94c34d31db1a30413a57617608a7c4bae343

43
hw_html/html.cpp Normal file
View File

@ -0,0 +1,43 @@
#include "html.hpp"
#include <ctml.hpp>
#include <stdio.h>
#include <string.h>
#include <errno.h>
html::html() :
f(nullptr)
{
}
html::~html()
{
if (f)
fclose(f);
}
html::error html::open(const char *const path)
{
if (!path)
return html::INVALID_PATH;
f = fopen(path, "wb");
if (!f)
{
fprintf(stderr, "could not open %s for writing, reason: %s\n", path,
strerror(errno));
return html::OPEN_ERR;
}
CTML::Document doc;
doc.AppendNodeToHead(CTML::Node("TITLE", "A9 register map"));
if (fprintf(f, "%s\n", doc.ToString().c_str()) < 0)
{
fprintf(stderr, "HTML write error\n");
return html::WRITE_ERR;
}
return html::OK;
}

21
hw_html/html.hpp Normal file
View File

@ -0,0 +1,21 @@
#include <ctml.hpp>
#include <stdio.h>
class html
{
public:
enum error
{
OK,
INVALID_PATH,
OPEN_ERR,
WRITE_ERR
};
html();
virtual ~html();
error open(const char *path);
protected:
FILE *f;
};

114
hw_html/main.cpp Normal file
View File

@ -0,0 +1,114 @@
#include "html.hpp"
#include "mcureg.hpp"
#include <xmlParser.h>
#include <string>
#include <stdio.h>
#include <stdlib.h>
int main(const int argc, const char *const argv[])
{
if (argc != 3)
{
fprintf(stderr, "%s <8955_hard.xml-path> <out-path>\n", argv[0]);
return EXIT_FAILURE;
}
const char *const inpath = argv[1];
const char *const outpath = argv[2];
html html;
if (html.open(outpath))
return EXIT_FAILURE;
XMLResults res;
XMLNode root = XMLNode::parseFile(inpath, "bigarchive", &res);
if (res.error != eXMLErrorNone)
{
fprintf(stderr, "Open %s failed, line %d, column %d, reason: %s.\n",
inpath, res.nLine, res.nColumn, XMLNode::getError(res.error));
return EXIT_FAILURE;
}
int n = 0;
for (int i = 0; i < root.nChildNode("archive"); i++)
{
const XMLNode archive = root.getChildNode("archive", &n);
const char *const relative = archive.getAttribute("relative");
if (!relative)
continue;
int n = 0;
for (int i = 0; i < archive.nChildNode("module"); i++)
{
const XMLNode module = archive.getChildNode("module", &n);
const char *const name = module.getAttribute("name");
if (!name)
continue;
printf("module %s\n", name);
int n = 0;
for (int i = 0; i < module.nChildNode("reg"); i++)
{
const XMLNode reg = module.getChildNode("reg", &n);
const char *const name = reg.getAttribute("name");
if (!name)
continue;
printf("\treg %s\n", name);
int n = 0;
for (int i = 0; i < reg.nChildNode("bits"); i++)
{
const XMLNode bits = reg.getChildNode("bits", &n);
const char *const name = bits.getAttribute("name");
mcureg::access access = mcureg::UNDEF;
const char *const access_cs = bits.getAttribute("access");
if (!access_cs)
continue;
const std::string access_s = access_cs;
if (access_s == "rsv")
access = mcureg::RSV;
else if (access_s == "w1c")
access = mcureg::W1C;
else if (access_s == "w1s")
access = mcureg::W1S;
else if (access_s == "rc")
access = mcureg::RC;
else if (access_s == "rs")
access = mcureg::RS;
else if (access_s == "rw")
access = mcureg::RW;
else if (access_s == "c")
access = mcureg::C;
else if (access_s == "s")
access = mcureg::S;
else if (access_s == "r")
access = mcureg::R;
else if (access_s == "w")
access = mcureg::W;
if (access == mcureg::UNDEF)
fprintf(stderr, "%s: undefined access\n", name);
else
{
printf("\t\t%s, access %s\n", name, access_cs);
}
}
}
}
}
return EXIT_SUCCESS;
}

5
hw_html/mcureg.cpp Normal file
View File

@ -0,0 +1,5 @@
#include "mcureg.hpp"
mcureg::mcureg(mcureg::access access)
{
}

8
hw_html/mcureg.hpp Normal file
View File

@ -0,0 +1,8 @@
class mcureg
{
public:
enum access {UNDEF, C, R, S, W, RC, RS, RW, RSV, W1C, W1S};
explicit mcureg(access access);
virtual ~mcureg() = default;
};

1
hw_html/xmlParser Submodule

@ -0,0 +1 @@
Subproject commit ad1e7bcf1f28980d83c442d1d10d47a5fd2c1851