mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-13 07:32:23 -07:00
98 lines
2.7 KiB
C
98 lines
2.7 KiB
C
// Copyright (c) 2024 Epic Games Tools
|
|
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
|
|
|
////////////////////////////////
|
|
// Functions
|
|
|
|
RADDBGI_PROC RADDBGI_U64
|
|
raddbgi_hash(RADDBGI_U8 *ptr, RADDBGI_U64 size){
|
|
RADDBGI_U64 result = 5381;
|
|
RADDBGI_U8 *opl = ptr + size;
|
|
for (; ptr < opl; ptr += 1){
|
|
result = ((result << 5) + result) + *ptr;
|
|
}
|
|
return(result);
|
|
}
|
|
|
|
RADDBGI_PROC RADDBGI_U32
|
|
raddbgi_size_from_basic_type_kind(RADDBGI_TypeKind kind){
|
|
RADDBGI_U32 result = 0;
|
|
switch (kind){
|
|
#define X(N,C)
|
|
#define XZ(N,C,Z) case C: result = Z; break;
|
|
#define Y(A,N)
|
|
RADDBGI_TypeKindXList(X,XZ,Y)
|
|
#undef X
|
|
#undef XZ
|
|
#undef Y
|
|
}
|
|
return(result);
|
|
}
|
|
|
|
RADDBGI_PROC RADDBGI_U32
|
|
raddbgi_addr_size_from_arch(RADDBGI_Arch arch){
|
|
RADDBGI_U32 result = 0;
|
|
switch (arch){
|
|
#define X(N,C,Z) case C: result = Z; break;
|
|
RADDBGI_ArchXList(X)
|
|
#undef X
|
|
}
|
|
return(result);
|
|
}
|
|
|
|
//- eval helpers
|
|
|
|
RADDBGI_PROC RADDBGI_EvalConversionKind
|
|
raddbgi_eval_conversion_rule(RADDBGI_EvalTypeGroup in, RADDBGI_EvalTypeGroup out){
|
|
RADDBGI_EvalConversionKind result = 0;
|
|
switch (in + (out << 8)){
|
|
#define Y(i,o) case ((RADDBGI_EvalTypeGroup_##i) + ((RADDBGI_EvalTypeGroup_##o) << 8)):
|
|
#define Xb(c)
|
|
#define Xe(c) result = RADDBGI_EvalConversionKind_##c; break;
|
|
RADDBGI_EvalConversionKindFromTypeGroupPairMap(Y,Xb,Xe)
|
|
#undef Xe
|
|
#undef Xb
|
|
#undef Y
|
|
}
|
|
return(result);
|
|
}
|
|
|
|
RADDBGI_PROC RADDBGI_U8*
|
|
raddbgi_eval_conversion_message(RADDBGI_EvalConversionKind conversion_kind, RADDBGI_U64 *lenout){
|
|
RADDBGI_U8 *result = 0;
|
|
switch (conversion_kind){
|
|
#define X(N,msg) \
|
|
case RADDBGI_EvalConversionKind_##N: result = (RADDBGI_U8*)msg; *lenout = sizeof(msg) - 1; break;
|
|
RADDBGI_EvalConversionKindXList(X)
|
|
#undef X
|
|
}
|
|
return(result);
|
|
}
|
|
|
|
RADDBGI_PROC RADDBGI_S32
|
|
raddbgi_eval_opcode_type_compatible(RADDBGI_EvalOp op, RADDBGI_EvalTypeGroup group){
|
|
RADDBGI_S32 result = 0;
|
|
switch (op){
|
|
case RADDBGI_EvalOp_Neg: case RADDBGI_EvalOp_Add: case RADDBGI_EvalOp_Sub:
|
|
case RADDBGI_EvalOp_Mul: case RADDBGI_EvalOp_Div:
|
|
case RADDBGI_EvalOp_EqEq:case RADDBGI_EvalOp_NtEq:
|
|
case RADDBGI_EvalOp_LsEq:case RADDBGI_EvalOp_GrEq:
|
|
case RADDBGI_EvalOp_Less:case RADDBGI_EvalOp_Grtr:
|
|
{
|
|
if (group != RADDBGI_EvalTypeGroup_Other){
|
|
result = 1;
|
|
}
|
|
}break;
|
|
case RADDBGI_EvalOp_Mod:case RADDBGI_EvalOp_LShift:case RADDBGI_EvalOp_RShift:
|
|
case RADDBGI_EvalOp_BitNot:case RADDBGI_EvalOp_BitAnd:case RADDBGI_EvalOp_BitXor:
|
|
case RADDBGI_EvalOp_BitOr:case RADDBGI_EvalOp_LogNot:case RADDBGI_EvalOp_LogAnd:
|
|
case RADDBGI_EvalOp_LogOr:
|
|
{
|
|
if (group == RADDBGI_EvalTypeGroup_S || group == RADDBGI_EvalTypeGroup_U){
|
|
result = 1;
|
|
}
|
|
}break;
|
|
}
|
|
return(result);
|
|
}
|