Rewrote hresultwrap.cpp with the new changes, fixing some build errors too. Now to fix the remaining build errors.

This commit is contained in:
Pietro Gagliardi 2018-05-27 16:32:33 -04:00
parent 4a7e7ed983
commit cf945367a3
3 changed files with 69 additions and 67 deletions

View File

@ -4,97 +4,98 @@
#include <string.h>
#include "lib.hpp"
struct item {
Slice *name;
Slice *callingConvention;
Slice **params;
size_t nParams;
Slice *returns;
namespace {
class items {
public:
ByteSlice name;
ByteSlice callingConvention;
std::vector<ByteSlice> params;
ByteSlice returns;
bool keepReturn;
Slice *cond[2];
ByteSlice cond[2];
};
bool generate(const char *line, size_t n, FILE *fout)
#define noutbuf 2048
bool generate(ByteSlice line, FILE *fout)
{
std::vector<char> genout;
std::vector<Slice *> *tokens;
ByteSlice genout;
std::vector<ByteSlice> tokens;
size_t i, j;
struct item item;
items item;
size_t nw;
tokens = TokenizeWhitespace(line, n);
tokens = ByteSliceFields(line);
memset(&item, 0, sizeof (struct item));
new (&item) items;
i = 0;
item.returns = tokens->at(i);
if (item.returns->Data()[0] == '*') {
item.returns = new Slice(item.returns->Data() + 1, item.returns->Len() - 1);
item.returns = tokens.at(i);
item.keepReturn = false;
if (item.returns.Data()[0] == '*') {
item.returns = item.returns.Slice(1, item.returns.Len());
item.keepReturn = true;
}
i++;
if (tokens->size() % 2 == 1) {
item.callingConvention = tokens->at(i);
if (tokens.size() % 2 == 1) {
item.callingConvention = tokens.at(i);
i++;
}
item.name = tokens->at(i);
item.name = tokens.at(i);
i++;
item.cond[0] = tokens->at(tokens->size() - 2);
item.cond[1] = tokens->at(tokens->size() - 1);
item.nParams = (tokens->size() - 2) - i;
item.params = new Slice *[item.nParams];
for (j = 0; j < item.nParams; j++) {
item.params[j] = tokens->at(i);
item.cond[0] = tokens.at(tokens.size() - 2);
item.cond[1] = tokens.at(tokens.size() - 1);
item.params.reserve((tokens.size() - 2) - i);
for (j = 0; j < item.params.capacity(); j++) {
item.params.push_back(tokens.at(i));
i++;
}
AppendString(&genout, "HRESULT ");
if (item.callingConvention != NULL) {
AppendSlice(&genout, item.callingConvention);
genout.push_back(' ');
genout = ByteSlice(0, noutbuf);
genout = genout.AppendString("HRESULT ");
if (item.callingConvention.Len() != 0) {
genout = genout.Append(item.callingConvention);
genout = genout.AppendString(" ");
}
AppendSlice(&genout, item.name);
genout.push_back('(');
for (i = 0; i < item.nParams; i += 2) {
AppendSlice(&genout, item.params[i]);
genout.push_back(' ');
AppendSlice(&genout, item.params[i + 1]);
genout.push_back(',');
genout.push_back(' ');
genout = genout.Append(item.name);
genout = genout.AppendString("(");
for (i = 0; i < item.params.size(); i += 2) {
genout = genout.Append(item.params[i]);
genout = genout.AppendString(" ");
genout = genout.Append(item.params[i + 1]);
genout = genout.AppendString(", ");
}
if (item.keepReturn) {
AppendSlice(&genout, item.returns);
AppendString(&genout, " *ret");
} else if (item.nParams != 0) {
genout = genout.Append(item.returns);
genout = genout.AppendString(" *ret");
} else if (item.params.size() != 0)
// remove the trailing comma and space
genout.pop_back();
genout.pop_back();
} else
AppendString(&genout, "void");
genout.push_back(')');
genout.push_back('\n');
genout = genout.Slice(0, genout.Len() - 2);
else
genout = genout.AppendString("void");
genout = genout.AppendString(")\n");
delete[] item.params;
if (item.keepReturn)
delete item.returns;
FreeTokenized(tokens);
item.~items();
genout.push_back('\n');
nw = fwrite(genout.data(), sizeof (char), genout.size(), fout);
return nw == genout.size();
genout = genout.AppendString("\n");
nw = fwrite(genout.Data(), sizeof (char), genout.Len(), fout);
return nw == genout.Len();
}
bool process(const char *line, size_t n, FILE *fout)
bool process(ByteSlice line, FILE *fout)
{
size_t nw;
if (n > 0 && line[0] == '@')
return generate(line + 1, n - 1, fout);
nw = fwrite(line, sizeof (char), n, fout);
if (nw != n)
if (line.Len() > 0 && line.Data()[0] == '@')
return generate(line.Slice(1, line.Len()), fout);
nw = fwrite(line.Data(), sizeof (char), line.Len(), fout);
if (nw != line.Len())
return false;
return fwrite("\n", sizeof (char), 1, fout) == 1;
}
}
int main(int argc, char *argv[])
{
ReadCloser *fin = NULL;
@ -120,17 +121,11 @@ int main(int argc, char *argv[])
}
s = new Scanner(fin);
while (s->Scan()) {
const char *line;
size_t n;
line = s->Bytes();
n = s->Len();
if (!process(line, n, fout)) {
while (s->Scan())
if (!process(s->Bytes(), fout)) {
fprintf(stderr, "error writing to %s\n", argv[2]);
goto done;
}
}
if (s->Err() != 0) {
fprintf(stderr, "error reading from %s: %s\n", argv[1], s->Err()->String());
goto done;

View File

@ -159,6 +159,12 @@ ByteSlice::ByteSlice(size_t len, size_t cap)
this->cap = cap;
}
ByteSlice::ByteSlice(int len, size_t cap) :
ByteSlice::ByteSlice((size_t) len, cap)
{
// do nothing else
}
ByteSlice::~ByteSlice(void)
{
sliceRelease(this->data);
@ -305,7 +311,7 @@ bool Scanner::Scan(void)
// otherwise, the buffer was exhausted in the middle of a line, so fall through
}
// need to refill the buffer
this->err = this->r->Read(this->buf, nbuf * sizeof (char), &n);
this->err = this->r->Read(this->buf, &n);
if (this->err != NULL)
return false;
this->p = this->buf;

View File

@ -24,6 +24,7 @@ public:
ByteSlice(ByteSlice &&b); // move constructor; sets b to ByteSlice()
ByteSlice(const char *b, size_t n);
ByteSlice(size_t len, size_t cap);
ByteSlice(int len, size_t cap); // deal with stupid rule about 0
~ByteSlice(void);
// note: copy assignment does not use copy-and-swap because I get neither copy-and-swap nor ADL public friend swap functions (https://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom, https://stackoverflow.com/questions/5695548/public-friend-swap-member-function)