Files
sigmaker-ida/idasdk76/module/java/resword.cpp
2021-10-31 21:20:46 +02:00

95 lines
2.5 KiB
C++

#include "java.hpp"
#include "npooluti.hpp"
//-----------------------------------------------------------------------
// as procedupre for converter only
void java_t::ResW_init(void)
{
static char const *const jasRW[] =
{
#include "jas_rw.cc"
};
for ( uint i = 0; i < j_lastnorm; i++ )
ResW.insert(Instructions[i].name);
ResW.insert(jasRW, jasRW+qnumber(jasRW));
}
//-----------------------------------------------------------------------
// as procedure for rw-changed
void java_t::ResW_validate(uint32 *Flags, const ushort *pend)
{
ushort *pi = tsPtr;
uchar *p = (uchar *)pi;
do
{
if ( *pi >= CHP_MAX )
return;
*p++ = (uchar)*pi++;
}
while ( pi < pend );
*p = '\0';
if ( ResW.find((const char *)tsPtr) != ResW.end() )
*Flags |= _OP_JSMRES_;
}
//-----------------------------------------------------------------------
// visible for converter only
uint32 java_t::upgrade_ResW(uint32 opstr)
{
if ( !(opstr & (_OP_NOWORD << 16)) ) // check for upg12
{
CASSERT(offsetof(_STROP_, size) == 0 && offsetof(_STROP_, flags) == 2);
uint32 len = (ushort)opstr;
uint32 flg = (opstr >> 16) & ~_OP_JSMRES_;
ResW_validate(&flg, tsPtr + len);
opstr = (flg << 16) | len;
}
return opstr;
}
//-----------------------------------------------------------------------
uchar java_t::ResW_oldbase(void)
{
if ( ConstantNode.altval(CNA_KWRDVER) != KEYWORD_VERSION )
{
ResW_init(); // prepare conversion
FOR_EACH_CONSTANT_POOL_INDEX(pos)
{
const_desc_t co;
if ( ConstantNode.supval(pos, &co, sizeof(co)) != sizeof(co) )
goto BADIDB;
if ( co.type != CONSTANT_Utf8 || !co._Ssize )
continue;
if ( (co._Sflags & _OP_JSMRES_) || !(co._Sflags & _OP_NOWORD) )
{
if ( !getblob(pos << 16, tsPtr, co._Ssize) )
goto BADIDB;
uint32 v = upgrade_ResW(co._Sopstr);
if ( v == co._Sopstr )
continue;
ConstantNode.altset(pos << 16, v);
co._Sopstr = v;
ConstantNode.supset(pos, &co, sizeof(co));
}
}
ResW.clear();
ConstantNode.altset(CNA_KWRDVER, KEYWORD_VERSION);
}
return 1;
BADIDB:
return 0;
}
//-----------------------------------------------------------------------
void java_t::ResW_newbase(void)
{
ConstantNode.altset(CNA_KWRDVER, KEYWORD_VERSION);
}
//-----------------------------------------------------------------------
void java_t::ResW_free(void)
{
ResW.clear(); // free mem - this set not needed later
}