Merge "fix handling pointers in emugen."
This commit is contained in:
@@ -549,7 +549,6 @@ int ApiGen::genDecoderImpl(const std::string &filename)
|
||||
std::string retvalType;
|
||||
if (!e->retval().isVoid()) {
|
||||
retvalType = e->retval().type()->name();
|
||||
if (e->retval().isPointer()) retvalType += "*";
|
||||
}
|
||||
|
||||
for (int pass = PASS_TmpBuffAlloc; pass < PASS_LAST; pass++) {
|
||||
@@ -593,15 +592,15 @@ int ApiGen::genDecoderImpl(const std::string &filename)
|
||||
(uint) j, varoffset.c_str());
|
||||
}
|
||||
if (pass == PASS_FunctionCall) {
|
||||
fprintf(fp, "(%s *)(ptr + %s + 4)",
|
||||
fprintf(fp, "(%s)(ptr + %s + 4)",
|
||||
v->type()->name().c_str(), varoffset.c_str());
|
||||
} else if (pass == PASS_DebugPrint) {
|
||||
fprintf(fp, "(%s *)(ptr + %s + 4), *(unsigned int *)(ptr + %s)",
|
||||
fprintf(fp, "(%s)(ptr + %s + 4), *(unsigned int *)(ptr + %s)",
|
||||
v->type()->name().c_str(), varoffset.c_str(),
|
||||
varoffset.c_str());
|
||||
}
|
||||
varoffset += " + 4 + *(size_t *)(ptr +" + varoffset + ")";
|
||||
} else { // in pointer;
|
||||
} else { // out pointer;
|
||||
if (pass == PASS_TmpBuffAlloc) {
|
||||
fprintf(fp, "\t\t\tsize_t tmpPtr%uSize = (size_t)*(unsigned int *)(ptr + %s);\n",
|
||||
(uint) j, varoffset.c_str());
|
||||
@@ -611,16 +610,16 @@ int ApiGen::genDecoderImpl(const std::string &filename)
|
||||
fprintf(fp, "\t\t\ttotalTmpSize += tmpPtr%uSize;\n", (uint)j);
|
||||
tmpBufOffset[j] = totalTmpBuffOffset;
|
||||
char tmpPtrName[16];
|
||||
sprintf(tmpPtrName,"tmpPtr%u", (uint)j);
|
||||
sprintf(tmpPtrName," + tmpPtr%uSize", (uint)j);
|
||||
totalTmpBuffOffset += std::string(tmpPtrName);
|
||||
totalTmpBuffExist = true;
|
||||
} else if (pass == PASS_MemAlloc) {
|
||||
fprintf(fp, "\t\t\tunsigned char *tmpPtr%u = &tmpBuf[%s];\n",
|
||||
(uint)j, tmpBufOffset[j].c_str());
|
||||
} else if (pass == PASS_FunctionCall) {
|
||||
fprintf(fp, "(%s *)(tmpPtr%u)", v->type()->name().c_str(), (uint) j);
|
||||
fprintf(fp, "(%s)(tmpPtr%u)", v->type()->name().c_str(), (uint) j);
|
||||
} else if (pass == PASS_DebugPrint) {
|
||||
fprintf(fp, "(%s *)(tmpPtr%u), *(unsigned int *)(ptr + %s)",
|
||||
fprintf(fp, "(%s)(tmpPtr%u), *(unsigned int *)(ptr + %s)",
|
||||
v->type()->name().c_str(), (uint) j,
|
||||
varoffset.c_str());
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@ void EntryPoint::reset()
|
||||
m_vars.empty();
|
||||
}
|
||||
|
||||
bool parseTypeField(const std::string & f, std::string *vartype, bool *pointer_type, std::string *varname)
|
||||
bool parseTypeField(const std::string & f, std::string *vartype, std::string *varname)
|
||||
{
|
||||
size_t pos = 0, last;
|
||||
bool done = false;
|
||||
@@ -45,7 +45,6 @@ bool parseTypeField(const std::string & f, std::string *vartype, bool *pointer_t
|
||||
|
||||
*vartype = "";
|
||||
if (varname != NULL) *varname = "";
|
||||
*pointer_type = false;
|
||||
|
||||
enum { ST_TYPE, ST_NAME, ST_END } state = ST_TYPE;
|
||||
|
||||
@@ -61,13 +60,6 @@ bool parseTypeField(const std::string & f, std::string *vartype, bool *pointer_t
|
||||
} else {
|
||||
// must be a type name;
|
||||
*vartype = str;
|
||||
// do we have an astriks at the end of the name?
|
||||
if (vartype->at(vartype->size() - 1) == '*') {
|
||||
*pointer_type = true;
|
||||
// remove the astriks
|
||||
(*vartype)[vartype->size() - 1] = ' ';
|
||||
*vartype = trim(*vartype);
|
||||
}
|
||||
state = ST_NAME;
|
||||
pos = last;
|
||||
}
|
||||
@@ -76,14 +68,13 @@ bool parseTypeField(const std::string & f, std::string *vartype, bool *pointer_t
|
||||
if (str.size() == 0) {
|
||||
done = true;
|
||||
} else if (str == "*") {
|
||||
*pointer_type = true;
|
||||
// remove the leading astriks;
|
||||
(*vartype) += "*";
|
||||
pos = last;
|
||||
} else if (varname == NULL) {
|
||||
done = true;
|
||||
} else {
|
||||
if (str[0] == '*') {
|
||||
*pointer_type = true;
|
||||
while (str[0] == '*') {
|
||||
(*vartype) += "*";
|
||||
str[0] = ' ';
|
||||
str = trim(str);
|
||||
}
|
||||
@@ -116,8 +107,7 @@ bool EntryPoint::parse(unsigned int lc, const std::string & str)
|
||||
// return type
|
||||
field = getNextToken(linestr, pos, &last, ",)");
|
||||
std::string retTypeName;
|
||||
bool pointer_type;
|
||||
if (!parseTypeField(field, &retTypeName, &pointer_type, NULL)) {
|
||||
if (!parseTypeField(field, &retTypeName, NULL)) {
|
||||
fprintf(stderr, "line: %d: Parsing error in field <%s>\n", lc, field.c_str());
|
||||
return false;
|
||||
}
|
||||
@@ -127,7 +117,7 @@ bool EntryPoint::parse(unsigned int lc, const std::string & str)
|
||||
fprintf(stderr, "UNKNOWN retval: %s\n", linestr.c_str());
|
||||
}
|
||||
|
||||
m_retval.init(std::string(""), theType, pointer_type, std::string(""), Var::POINTER_OUT, std::string(""));
|
||||
m_retval.init(std::string(""), theType, std::string(""), Var::POINTER_OUT, std::string(""));
|
||||
|
||||
// function name
|
||||
m_name = getNextToken(linestr, pos, &last, ",)");
|
||||
@@ -138,7 +128,7 @@ bool EntryPoint::parse(unsigned int lc, const std::string & str)
|
||||
while (pos < linestr.size() - 1) {
|
||||
field = getNextToken(linestr, pos, &last, ",)");
|
||||
std::string vartype, varname;
|
||||
if (!parseTypeField(field, &vartype, &pointer_type, &varname)) {
|
||||
if (!parseTypeField(field, &vartype, &varname)) {
|
||||
fprintf(stderr, "line: %d: Parsing error in field <%s>\n", lc, field.c_str());
|
||||
return false;
|
||||
}
|
||||
@@ -148,13 +138,13 @@ bool EntryPoint::parse(unsigned int lc, const std::string & str)
|
||||
fprintf(stderr, "%d: Unknown type: %s\n", lc, vartype.c_str());
|
||||
} else {
|
||||
if (varname == "" &&
|
||||
!(v->name() == "void" && !pointer_type)) {
|
||||
!(v->name() == "void" && !v->isPointer())) {
|
||||
std::ostringstream oss;
|
||||
oss << "var" << nvars;
|
||||
varname = oss.str();
|
||||
}
|
||||
|
||||
m_vars.push_back(Var(varname, v, pointer_type, std::string(""), Var::POINTER_IN, ""));
|
||||
m_vars.push_back(Var(varname, v, std::string(""), Var::POINTER_IN, ""));
|
||||
}
|
||||
pos = last + 1;
|
||||
}
|
||||
@@ -166,9 +156,8 @@ void EntryPoint::print(FILE *fp, bool newline,
|
||||
const std::string & name_prefix,
|
||||
const std::string & ctx_param ) const
|
||||
{
|
||||
fprintf(fp, "%s%s %s%s%s(",
|
||||
fprintf(fp, "%s %s%s%s(",
|
||||
m_retval.type()->name().c_str(),
|
||||
m_retval.isPointer() ? "*" : "",
|
||||
name_prefix.c_str(),
|
||||
m_name.c_str(),
|
||||
name_suffix.c_str());
|
||||
@@ -178,8 +167,7 @@ void EntryPoint::print(FILE *fp, bool newline,
|
||||
for (size_t i = 0; i < m_vars.size(); i++) {
|
||||
if (m_vars[i].isVoid()) continue;
|
||||
if (i != 0 || ctx_param != "") fprintf(fp, ", ");
|
||||
fprintf(fp, "%s %s%s", m_vars[i].type()->name().c_str(),
|
||||
m_vars[i].isPointer() ? "*" : "",
|
||||
fprintf(fp, "%s %s", m_vars[i].type()->name().c_str(),
|
||||
m_vars[i].name().c_str());
|
||||
}
|
||||
fprintf(fp, ")%s", newline? "\n" : "");
|
||||
|
||||
@@ -48,18 +48,18 @@ static VarConverter * getVarConverter(int size)
|
||||
return v;
|
||||
}
|
||||
|
||||
#define ADD_TYPE(name, size, printformat) \
|
||||
g_varMap.insert(std::pair<std::string, VarType>(name, VarType(g_typeId++, name, &g_var##size,printformat)));
|
||||
#define ADD_TYPE(name, size, printformat,ispointer) \
|
||||
g_varMap.insert(std::pair<std::string, VarType>(name, VarType(g_typeId++, name, &g_var##size , printformat , ispointer)));
|
||||
|
||||
void TypeFactory::initBaseTypes()
|
||||
{
|
||||
g_initialized = true;
|
||||
ADD_TYPE("UNKNOWN", 0, "0x%x");
|
||||
ADD_TYPE("void", 0, "0x%x");
|
||||
ADD_TYPE("char", 8, "%c");
|
||||
ADD_TYPE("int", 32, "%d");
|
||||
ADD_TYPE("float", 32, "%d");
|
||||
ADD_TYPE("short", 16, "%d");
|
||||
ADD_TYPE("UNKNOWN", 0, "0x%x", false);
|
||||
ADD_TYPE("void", 0, "0x%x", false);
|
||||
ADD_TYPE("char", 8, "%c", false);
|
||||
ADD_TYPE("int", 32, "%d", false);
|
||||
ADD_TYPE("float", 32, "%d", false);
|
||||
ADD_TYPE("short", 16, "%d", false);
|
||||
}
|
||||
|
||||
int TypeFactory::initFromFile(const std::string &filename)
|
||||
@@ -103,6 +103,25 @@ int TypeFactory::initFromFile(const std::string &filename)
|
||||
return -2;
|
||||
}
|
||||
|
||||
pos = last + 1;
|
||||
std::string pointerDef;
|
||||
pointerDef = getNextToken(str, pos, &last, WHITESPACE);
|
||||
if (pointerDef.size() == 0) {
|
||||
fprintf(stderr, "Error: %d : missing ispointer definition\n", lc);
|
||||
return -2;
|
||||
}
|
||||
|
||||
bool isPointer=false;
|
||||
if (std::string("true")==pointerDef)
|
||||
isPointer = true;
|
||||
else if (std::string("false")==pointerDef)
|
||||
isPointer = false;
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "Error: %d : invalid isPointer definition, must be either \"true\" or \"false\"\n", lc);
|
||||
return -2;
|
||||
}
|
||||
|
||||
VarConverter *v = getVarConverter(atoi(size.c_str()));
|
||||
if (v == NULL) {
|
||||
fprintf(stderr, "Error: %d : unknown var width: %d\n", lc, atoi(size.c_str()));
|
||||
@@ -114,7 +133,7 @@ int TypeFactory::initFromFile(const std::string &filename)
|
||||
"Warining: %d : type %s is already known, definition in line %d is taken\n",
|
||||
lc, name.c_str(), lc);
|
||||
}
|
||||
g_varMap.insert(std::pair<std::string, VarType>(name, VarType(g_typeId++, name, v ,printString)));
|
||||
g_varMap.insert(std::pair<std::string, VarType>(name, VarType(g_typeId++, name, v ,printString,isPointer)));
|
||||
}
|
||||
g_initialized = true;
|
||||
return 0;
|
||||
|
||||
@@ -27,7 +27,6 @@ public:
|
||||
Var() :
|
||||
m_name(""),
|
||||
m_type(NULL),
|
||||
m_pointer(false),
|
||||
m_lenExpression(""),
|
||||
m_pointerDir(POINTER_IN),
|
||||
m_nullAllowed(false),
|
||||
@@ -38,13 +37,11 @@ public:
|
||||
|
||||
Var(const std::string & name,
|
||||
const VarType * vartype,
|
||||
bool isPointer,
|
||||
const std::string & lenExpression,
|
||||
PointerDir dir,
|
||||
const std::string &packExpression) :
|
||||
m_name(name),
|
||||
m_type(const_cast<VarType *>(vartype)),
|
||||
m_pointer(isPointer),
|
||||
m_lenExpression(lenExpression),
|
||||
m_pointerDir(dir),
|
||||
m_nullAllowed(false),
|
||||
@@ -53,11 +50,10 @@ public:
|
||||
}
|
||||
|
||||
void init(const std::string name, const VarType * vartype,
|
||||
bool isPointer, std::string lenExpression,
|
||||
std::string lenExpression,
|
||||
PointerDir dir, std::string packExpression) {
|
||||
m_name = name;
|
||||
m_type = vartype;
|
||||
m_pointer = isPointer;
|
||||
m_lenExpression = lenExpression;
|
||||
m_packExpression = packExpression;
|
||||
m_pointerDir = dir;
|
||||
@@ -67,8 +63,8 @@ public:
|
||||
|
||||
const std::string & name() const { return m_name; }
|
||||
const VarType * type() const { return m_type; }
|
||||
bool isPointer() const { return m_pointer; }
|
||||
bool isVoid() const { return ((m_type->bytes() == 0) && (m_pointer == false)); }
|
||||
bool isPointer() const { return m_type->isPointer(); }
|
||||
bool isVoid() const { return ((m_type->bytes() == 0) && (!m_type->isPointer())); }
|
||||
const std::string & lenExpression() const { return m_lenExpression; }
|
||||
const std::string & packExpression() const { return(m_packExpression); }
|
||||
void setLenExpression(const std::string & lenExpression) { m_lenExpression = lenExpression; }
|
||||
@@ -77,7 +73,7 @@ public:
|
||||
PointerDir pointerDir() { return m_pointerDir; }
|
||||
void setNullAllowed(bool state) { m_nullAllowed = state; }
|
||||
bool nullAllowed() const { return m_nullAllowed; }
|
||||
void printType(FILE *fp) { fprintf(fp, "%s%s", m_type->name().c_str(), m_pointer ? "*" : ""); }
|
||||
void printType(FILE *fp) { fprintf(fp, "%s", m_type->name().c_str()); }
|
||||
void printTypeName(FILE *fp) { printType(fp); fprintf(fp, " %s", m_name.c_str()); }
|
||||
|
||||
private:
|
||||
|
||||
@@ -50,12 +50,12 @@ public:
|
||||
class VarType {
|
||||
public:
|
||||
VarType() :
|
||||
m_id(0), m_name("default_constructed"), m_converter(NULL), m_printFomrat("0x%x")
|
||||
m_id(0), m_name("default_constructed"), m_converter(NULL), m_printFomrat("0x%x"), m_isPointer(false)
|
||||
{
|
||||
}
|
||||
|
||||
VarType(size_t id, const std::string & name, const VarConverter * converter, const std::string & printFormat ) :
|
||||
m_id(id), m_name(name), m_converter(const_cast<VarConverter *>(converter)), m_printFomrat(printFormat)
|
||||
VarType(size_t id, const std::string & name, const VarConverter * converter, const std::string & printFormat , const bool isPointer) :
|
||||
m_id(id), m_name(name), m_converter(const_cast<VarConverter *>(converter)), m_printFomrat(printFormat), m_isPointer(isPointer)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -65,12 +65,14 @@ public:
|
||||
const std::string & name() const { return m_name; }
|
||||
const std::string & printFormat() const { return m_printFomrat; }
|
||||
size_t bytes() const { return m_converter->bytes(); }
|
||||
bool isPointer() const { return m_isPointer; }
|
||||
size_t id() const { return m_id; }
|
||||
private:
|
||||
size_t m_id;
|
||||
std::string m_name;
|
||||
VarConverter * m_converter;
|
||||
std::string m_printFomrat;
|
||||
bool m_isPointer;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user