95 lines
2.5 KiB
C++
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
|
|
}
|