1
0
Fork 0

PROJECT: updated BeaEngine (r8L -> r8b)

DBG: updated internal function 'valfromstring' to be more friendly
DBG: updated valfromstring to only look for the value of registers/memory/addr (this is faster)
This commit is contained in:
mr.exodia 2014-02-22 15:34:34 +01:00
parent f0fc3ea4f9
commit a3ec27853c
11 changed files with 96 additions and 83 deletions

Binary file not shown.

Binary file not shown.

View File

@ -1,11 +1,11 @@

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "x64_dbg_bridge", "x64_dbg_bridge\x64_dbg_bridge.vcxproj", "{673CBB44-08B5-54E0-E77B-E13E3BD8D967}"
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "x64_dbg_bridge", "x64_dbg_bridge\x64_dbg_bridge.vcxproj", "{944D9923-CB1A-6F6C-BCBC-9E00A71954C1}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "x64_dbg_exe", "x64_dbg_exe\x64_dbg_exe.vcxproj", "{F633E592-F510-42C4-A68D-602F54BE22EF}"
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "x64_dbg_exe", "x64_dbg_exe\x64_dbg_exe.vcxproj", "{3A22175E-6B72-FDCC-1603-C4A2163C7900}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "x64_dbg_dbg", "x64_dbg_dbg\x64_dbg_dbg.vcxproj", "{C84269E0-6E03-389A-C4E9-9EF93C23AB9F}"
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "x64_dbg_dbg", "x64_dbg_dbg\x64_dbg_dbg.vcxproj", "{E6548308-401E-3A8A-5819-905DB90522A6}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -13,18 +13,18 @@ Global
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{673CBB44-08B5-54E0-E77B-E13E3BD8D967}.Release|Win32.ActiveCfg = Release|Win32
{673CBB44-08B5-54E0-E77B-E13E3BD8D967}.Release|Win32.Build.0 = Release|Win32
{673CBB44-08B5-54E0-E77B-E13E3BD8D967}.Release|x64.ActiveCfg = Release|x64
{673CBB44-08B5-54E0-E77B-E13E3BD8D967}.Release|x64.Build.0 = Release|x64
{F633E592-F510-42C4-A68D-602F54BE22EF}.Release|Win32.ActiveCfg = Release|Win32
{F633E592-F510-42C4-A68D-602F54BE22EF}.Release|Win32.Build.0 = Release|Win32
{F633E592-F510-42C4-A68D-602F54BE22EF}.Release|x64.ActiveCfg = Release|x64
{F633E592-F510-42C4-A68D-602F54BE22EF}.Release|x64.Build.0 = Release|x64
{C84269E0-6E03-389A-C4E9-9EF93C23AB9F}.Release|Win32.ActiveCfg = Release|Win32
{C84269E0-6E03-389A-C4E9-9EF93C23AB9F}.Release|Win32.Build.0 = Release|Win32
{C84269E0-6E03-389A-C4E9-9EF93C23AB9F}.Release|x64.ActiveCfg = Release|x64
{C84269E0-6E03-389A-C4E9-9EF93C23AB9F}.Release|x64.Build.0 = Release|x64
{944D9923-CB1A-6F6C-BCBC-9E00A71954C1}.Release|Win32.ActiveCfg = Release|Win32
{944D9923-CB1A-6F6C-BCBC-9E00A71954C1}.Release|Win32.Build.0 = Release|Win32
{944D9923-CB1A-6F6C-BCBC-9E00A71954C1}.Release|x64.ActiveCfg = Release|x64
{944D9923-CB1A-6F6C-BCBC-9E00A71954C1}.Release|x64.Build.0 = Release|x64
{3A22175E-6B72-FDCC-1603-C4A2163C7900}.Release|Win32.ActiveCfg = Release|Win32
{3A22175E-6B72-FDCC-1603-C4A2163C7900}.Release|Win32.Build.0 = Release|Win32
{3A22175E-6B72-FDCC-1603-C4A2163C7900}.Release|x64.ActiveCfg = Release|x64
{3A22175E-6B72-FDCC-1603-C4A2163C7900}.Release|x64.Build.0 = Release|x64
{E6548308-401E-3A8A-5819-905DB90522A6}.Release|Win32.ActiveCfg = Release|Win32
{E6548308-401E-3A8A-5819-905DB90522A6}.Release|Win32.Build.0 = Release|Win32
{E6548308-401E-3A8A-5819-905DB90522A6}.Release|x64.ActiveCfg = Release|x64
{E6548308-401E-3A8A-5819-905DB90522A6}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@ -70,7 +70,7 @@ extern "C" DLL_EXPORT bool _dbg_memisvalidreadptr(duint addr)
extern "C" DLL_EXPORT bool _dbg_valfromstring(const char* string, duint* value)
{
return valfromstring(string, value, 0, 0, true, 0);
return valfromstring(string, value);
}
extern "C" DLL_EXPORT bool _dbg_isdebugging()

View File

@ -648,7 +648,7 @@ static DWORD WINAPI threadDebugLoop(void* lpParameter)
SetCustomHandler(UE_CH_UNLOADDLL, (void*)cbUnloadDll);
SetCustomHandler(UE_CH_OUTPUTDEBUGSTRING, (void*)cbOutputDebugString);
SetCustomHandler(UE_CH_UNHANDLEDEXCEPTION, (void*)cbException);
//inform GUI start we started without problems
//inform GUI we started without problems
GuiSetDebugState(initialized);
//set GUI title
strcpy(szBaseFileName, szFileName);
@ -821,7 +821,7 @@ CMDRESULT cbDebugSetBPX(int argc, char* argv[]) //bp addr [,name [,type]]
}
_strlwr(argtype);
uint addr=0;
if(!valfromstring(argaddr, &addr, 0, 0, true, 0))
if(!valfromstring(argaddr, &addr))
{
dprintf("invalid addr: \"%s\"\n", argaddr);
return STATUS_ERROR;
@ -895,7 +895,7 @@ CMDRESULT cbDebugDeleteBPX(int argc, char* argv[])
return STATUS_CONTINUE;
}
uint addr=0;
if(!valfromstring(arg1, &addr, 0, 0, true, 0) or !bpget(addr, BPNORMAL, 0, &found)) //invalid breakpoint
if(!valfromstring(arg1, &addr) or !bpget(addr, BPNORMAL, 0, &found)) //invalid breakpoint
{
dprintf("no such breakpoint \"%s\"\n", arg1);
return STATUS_ERROR;
@ -948,7 +948,7 @@ CMDRESULT cbDebugEnableBPX(int argc, char* argv[])
return STATUS_CONTINUE;
}
uint addr=0;
if(!valfromstring(arg1, &addr, 0, 0, true, 0) or !bpget(addr, BPNORMAL, 0, &found)) //invalid breakpoint
if(!valfromstring(arg1, &addr) or !bpget(addr, BPNORMAL, 0, &found)) //invalid breakpoint
{
dprintf("no such breakpoint \"%s\"\n", arg1);
return STATUS_ERROR;
@ -1007,7 +1007,7 @@ CMDRESULT cbDebugDisableBPX(int argc, char* argv[])
return STATUS_CONTINUE;
}
uint addr=0;
if(!valfromstring(arg1, &addr, 0, 0, true, 0) or !bpget(addr, BPNORMAL, 0, &found)) //invalid breakpoint
if(!valfromstring(arg1, &addr) or !bpget(addr, BPNORMAL, 0, &found)) //invalid breakpoint
{
dprintf("no such breakpoint \"%s\"\n", arg1);
return STATUS_ERROR;
@ -1087,7 +1087,7 @@ CMDRESULT cbDebugSingleStep(int argc, char* argv[])
uint stepcount=1;
if(argget(*argv, arg1, 0, true))
{
if(!valfromstring(arg1, &stepcount, 0, 0, true, 0))
if(!valfromstring(arg1, &stepcount))
stepcount=1;
}
SingleStep((DWORD)stepcount, (void*)cbStep);
@ -1115,7 +1115,7 @@ CMDRESULT cbDebugDisasm(int argc, char* argv[])
char arg1[deflen]="";
uint addr=GetContextData(UE_CIP);
if(argget(*argv, arg1, 0, true))
if(!valfromstring(arg1, &addr, 0, 0, true, 0))
if(!valfromstring(arg1, &addr))
addr=GetContextData(UE_CIP);
DebugUpdateGui(addr);
return STATUS_CONTINUE;
@ -1127,7 +1127,7 @@ CMDRESULT cbDebugSetMemoryBpx(int argc, char* argv[])
if(!argget(*argv, arg1, 0, false))
return STATUS_ERROR;
uint addr;
if(!valfromstring(arg1, &addr, 0, 0, true, 0))
if(!valfromstring(arg1, &addr))
return STATUS_ERROR;
bool restore=false;
char arg2[deflen]=""; //restore
@ -1224,7 +1224,7 @@ CMDRESULT cbDebugDeleteMemoryBreakpoint(int argc, char* argv[])
return STATUS_CONTINUE;
}
uint addr=0;
if(!valfromstring(arg1, &addr, 0, 0, true, 0) or !bpget(addr, BPMEMORY, 0, &found)) //invalid breakpoint
if(!valfromstring(arg1, &addr) or !bpget(addr, BPMEMORY, 0, &found)) //invalid breakpoint
{
dprintf("no such memory breakpoint \"%s\"\n", arg1);
return STATUS_ERROR;
@ -1260,7 +1260,7 @@ CMDRESULT cbDebugSetHardwareBreakpoint(int argc, char* argv[])
if(!argget(*argv, arg1, 0, false))
return STATUS_ERROR;
uint addr;
if(!valfromstring(arg1, &addr, 0, 0, true, 0))
if(!valfromstring(arg1, &addr))
return STATUS_ERROR;
uint type=UE_HARDWARE_EXECUTE;
char arg2[deflen]=""; //type
@ -1285,7 +1285,7 @@ CMDRESULT cbDebugSetHardwareBreakpoint(int argc, char* argv[])
uint size=UE_HARDWARE_SIZE_1;
if(argget(*argv, arg3, 2, true))
{
if(!valfromstring(arg3, &size, 0, 0, true, 0))
if(!valfromstring(arg3, &size))
return STATUS_ERROR;
switch(size)
{
@ -1372,7 +1372,7 @@ CMDRESULT cbDebugDeleteHardwareBreakpoint(int argc, char* argv[])
return STATUS_CONTINUE;
}
uint addr=0;
if(!valfromstring(arg1, &addr, 0, 0, true, 0) or !bpget(addr, BPHARDWARE, 0, &found)) //invalid breakpoint
if(!valfromstring(arg1, &addr) or !bpget(addr, BPHARDWARE, 0, &found)) //invalid breakpoint
{
dprintf("no such hardware breakpoint \"%s\"\n", arg1);
return STATUS_ERROR;
@ -1392,7 +1392,7 @@ CMDRESULT cbDebugAlloc(int argc, char* argv[])
char arg1[deflen]=""; //size
uint size=0x1000;
if(argget(*argv, arg1, 0, true))
if(!valfromstring(arg1, &size, 0, 0, false, 0))
if(!valfromstring(arg1, &size, false))
return STATUS_ERROR;
uint mem=(uint)memalloc(fdProcessInfo->hProcess, 0, size, PAGE_EXECUTE_READWRITE);
if(!mem)
@ -1413,7 +1413,7 @@ CMDRESULT cbDebugFree(int argc, char* argv[])
uint addr=lastalloc;
if(argget(*argv, arg1, 0, true))
{
if(!valfromstring(arg1, &addr, 0, 0, false, 0))
if(!valfromstring(arg1, &addr, false))
return STATUS_ERROR;
}
else if(!lastalloc)
@ -1440,11 +1440,11 @@ CMDRESULT cbDebugMemset(int argc, char* argv[])
uint size;
if(!argget(*argv, arg1, 0, false) or !argget(*argv, arg2, 1, false))
return STATUS_ERROR;
if(!valfromstring(arg1, &addr, 0, 0, false, 0) or !valfromstring(arg2, &value, 0, 0, false, 0))
if(!valfromstring(arg1, &addr, false) or !valfromstring(arg2, &value, false))
return STATUS_ERROR;
if(argget(*argv, arg3, 2, true))
{
if(!valfromstring(arg3, &size, 0, 0, false, 0))
if(!valfromstring(arg3, &size, false))
return STATUS_ERROR;
}
else
@ -1473,7 +1473,7 @@ CMDRESULT cbBenchmark(int argc, char* argv[])
if(!argget(*argv, arg1, 0, false))
return STATUS_ERROR;
uint addr=0;
if(!valfromstring(arg1, &addr, 0, 0, false, 0))
if(!valfromstring(arg1, &addr, false))
return STATUS_ERROR;
uint ticks=GetTickCount();
for(int i=0; i<10000; i++)
@ -1503,7 +1503,7 @@ CMDRESULT cbMemWrite(int argc, char* argv[])
if(!argget(*argv, arg1, 0, false))
return STATUS_ERROR;
uint addr=0;
if(!valfromstring(arg1, &addr, 0, 0, false, 0))
if(!valfromstring(arg1, &addr, false))
return STATUS_ERROR;
unsigned char* blub=(unsigned char*)emalloc(0x2123, "cbMemWrite:blub");
memread(fdProcessInfo->hProcess, (const void*)addr, blub, 0x2123, 0);
@ -1624,7 +1624,7 @@ CMDRESULT cbDebugAttach(int argc, char* argv[])
return STATUS_ERROR;
}
uint pid=0;
if(!valfromstring(argv[1], &pid, 0, 0, true, 0))
if(!valfromstring(argv[1], &pid))
{
dprintf("invalid expression \"%s\"!\n", argv[1]);
return STATUS_ERROR;
@ -1687,7 +1687,7 @@ CMDRESULT cbDebugDump(int argc, char* argv[])
return STATUS_ERROR;
}
duint addr=0;
if(!valfromstring(argv[1], &addr, 0, 0, true, 0))
if(!valfromstring(argv[1], &addr))
{
dprintf("invalid address \"%s\"!\n", argv[1]);
return STATUS_ERROR;

View File

@ -68,7 +68,8 @@ static bool HandleArgument(ARGTYPE* Argument, INSTRTYPE* Instruction, DISASM_ARG
value=Instruction->AddrValue;
arg->constant=value;
arg->value=0;
valfromstring(argmnemonic, &value, 0, 0, true, 0);
if(!valfromstring(argmnemonic, &value, true, true))
return false;
if(DbgMemIsValidReadPtr(value))
{
arg->value=value;
@ -94,11 +95,8 @@ static bool HandleArgument(ARGTYPE* Argument, INSTRTYPE* Instruction, DISASM_ARG
arg->segment=SEG_DEFAULT;
arg->type=arg_normal;
uint value=0;
if(!valfromstring(argmnemonic, &value, 0, 0, true, 0))
{
dprintf("HandleArgument:valfromstring failed!->%p\n", addr);
if(!valfromstring(argmnemonic, &value, true, true))
return false;
}
arg->value=value;
char sValue[64]="";
sprintf(sValue, "%"fext"X", value);

View File

@ -16,7 +16,7 @@ CMDRESULT cbBadCmd(int argc, char* argv[])
int valsize=0;
bool isvar=false;
bool hexonly=false;
if(valfromstring(*argv, &value, &valsize, &isvar, false, &hexonly)) //dump variable/value/register/etc
if(valfromstring(*argv, &value, false, false, &valsize, &isvar, &hexonly)) //dump variable/value/register/etc
{
//dprintf("[DEBUG] valsize: %d\n", valsize);
if(valsize)
@ -77,12 +77,12 @@ CMDRESULT cbInstrVar(int argc, char* argv[])
int add=0;
if(*arg1=='$')
add++;
if(valfromstring(arg1+add, &value, 0, 0, true, 0))
if(valfromstring(arg1+add, &value))
{
dprintf("invalid variable name \"%s\"\n", arg1);
return STATUS_ERROR;
}
if(!valfromstring(arg2, &value, 0, 0, false, 0))
if(!valfromstring(arg2, &value))
{
dprintf("invalid value \"%s\"\n", arg2);
return STATUS_ERROR;
@ -123,18 +123,16 @@ CMDRESULT cbInstrMov(int argc, char* argv[])
if(!argget(*argv, arg2, 1, false)) //src name
return STATUS_ERROR;
uint set_value=0;
if(!valfromstring(arg2, &set_value, 0, 0, false, 0))
if(!valfromstring(arg2, &set_value))
{
dprintf("invalid src \"%s\"\n", arg2);
return STATUS_ERROR;
}
bool isvar=false;
uint temp;
valfromstring(arg1, &temp, 0, &isvar, true, 0);
if(!isvar or !valtostring(arg1, &set_value, false))
if(!isvar or !valtostring(arg1, &set_value, true))
{
uint value;
if(valfromstring(arg1, &value, 0, 0, true, 0))
if(valfromstring(arg1, &value))
{
dprintf("invalid dest \"%s\"\n", arg1);
return STATUS_ERROR;
@ -221,7 +219,7 @@ CMDRESULT cbInstrCmt(int argc, char* argv[])
if(!argget(*argv, arg1, 0, false))
return STATUS_ERROR;
uint addr=0;
if(!valfromstring(arg1, &addr, 0, 0, true, 0))
if(!valfromstring(arg1, &addr))
{
dprintf("invalid address: \"%s\"\n", arg1);
return STATUS_ERROR;
@ -243,7 +241,7 @@ CMDRESULT cbInstrCmtdel(int argc, char* argv[])
if(!argget(*argv, arg1, 0, false))
return STATUS_ERROR;
uint addr=0;
if(!valfromstring(arg1, &addr, 0, 0, true, 0))
if(!valfromstring(arg1, &addr))
{
dprintf("invalid address: \"%s\"\n", arg1);
return STATUS_ERROR;
@ -262,7 +260,7 @@ CMDRESULT cbInstrLbl(int argc, char* argv[])
if(!argget(*argv, arg1, 0, false))
return STATUS_ERROR;
uint addr=0;
if(!valfromstring(arg1, &addr, 0, 0, true, 0))
if(!valfromstring(arg1, &addr))
{
dprintf("invalid address: \"%s\"\n", arg1);
return STATUS_ERROR;
@ -284,7 +282,7 @@ CMDRESULT cbInstrLbldel(int argc, char* argv[])
if(!argget(*argv, arg1, 0, false))
return STATUS_ERROR;
uint addr=0;
if(!valfromstring(arg1, &addr, 0, 0, true, 0))
if(!valfromstring(arg1, &addr))
{
dprintf("invalid address: \"%s\"\n", arg1);
return STATUS_ERROR;
@ -304,7 +302,7 @@ CMDRESULT cbInstrBookmarkSet(int argc, char* argv[])
if(!argget(*argv, arg1, 0, false))
return STATUS_ERROR;
uint addr=0;
if(!valfromstring(arg1, &addr, 0, 0, true, 0))
if(!valfromstring(arg1, &addr))
{
dprintf("invalid address: \"%s\"\n", arg1);
return STATUS_ERROR;
@ -324,7 +322,7 @@ CMDRESULT cbInstrBookmarkDel(int argc, char* argv[])
if(!argget(*argv, arg1, 0, false))
return STATUS_ERROR;
uint addr=0;
if(!valfromstring(arg1, &addr, 0, 0, true, 0))
if(!valfromstring(arg1, &addr))
{
dprintf("invalid address: \"%s\"\n", arg1);
return STATUS_ERROR;
@ -367,7 +365,7 @@ CMDRESULT cbAssemble(int argc, char* argv[])
return STATUS_ERROR;
}
uint addr=0;
if(!valfromstring(argv[1], &addr, 0, 0, true, 0))
if(!valfromstring(argv[1], &addr))
{
dprintf("invalid expression: \"%s\"!\n", argv[1]);
return STATUS_ERROR;
@ -428,7 +426,7 @@ CMDRESULT cbFunctionAdd(int argc, char* argv[])
}
uint start=0;
uint end=0;
if(!valfromstring(argv[1], &start, 0, 0, false, 0) or !valfromstring(argv[2], &end, 0, 0, false, 0))
if(!valfromstring(argv[1], &start, false) or !valfromstring(argv[2], &end, false))
return STATUS_ERROR;
if(!functionadd(start, end, true))
{
@ -447,7 +445,7 @@ CMDRESULT cbFunctionDel(int argc, char* argv[])
return STATUS_ERROR;
}
uint addr=0;
if(!valfromstring(argv[1], &addr, 0, 0, false, 0))
if(!valfromstring(argv[1], &addr, false))
return STATUS_ERROR;
if(!functiondel(addr))
{
@ -466,10 +464,10 @@ CMDRESULT cbInstrCmp(int argc, char* argv[])
return STATUS_ERROR;
}
uint arg1=0;
if(!valfromstring(argv[1], &arg1, 0, 0, false, 0))
if(!valfromstring(argv[1], &arg1, false))
return STATUS_ERROR;
uint arg2=0;
if(!valfromstring(argv[2], &arg2, 0, 0, false, 0))
if(!valfromstring(argv[2], &arg2, false))
return STATUS_ERROR;
uint ezflag;
uint bsflag;
@ -510,7 +508,7 @@ CMDRESULT cbInstrGpa(int argc, char* argv[])
else
sprintf(newcmd, "%s", argv[1]);
uint result=0;
if(!valfromstring(newcmd, &result, 0, 0, false, 0))
if(!valfromstring(newcmd, &result, false))
return STATUS_ERROR;
varset("$RESULT", result, false);
return STATUS_CONTINUE;
@ -709,10 +707,10 @@ CMDRESULT cbInstrTest(int argc, char* argv[])
return STATUS_ERROR;
}
uint arg1=0;
if(!valfromstring(argv[1], &arg1, 0, 0, false, 0))
if(!valfromstring(argv[1], &arg1, false))
return STATUS_ERROR;
uint arg2=0;
if(!valfromstring(argv[2], &arg2, 0, 0, false, 0))
if(!valfromstring(argv[2], &arg2, false))
return STATUS_ERROR;
uint ezflag;
uint bsflag=0;

View File

@ -295,7 +295,7 @@ static void adjustpairs(EXPRESSION* exps, int cur_open, int cur_close, int cur_l
}
}
static bool printlayer(char* exp, EXPRESSION* exps, int layer, bool silent)
static bool printlayer(char* exp, EXPRESSION* exps, int layer, bool silent, bool baseonly)
{
for(int i=0; i<exps->total_pairs; i++)
{
@ -312,7 +312,7 @@ static bool printlayer(char* exp, EXPRESSION* exps, int layer, bool silent)
strcpy(backup, exp+open+len+1);
uint value;
if(!mathfromstring(temp, &value, 0, 0, silent))
if(!mathfromstring(temp, &value, silent, baseonly, 0, 0))
return false;
adjustpairs(exps, open, close, len+1, sprintf(exp+open, "%X", value));
@ -325,7 +325,7 @@ static bool printlayer(char* exp, EXPRESSION* exps, int layer, bool silent)
return true;
}
bool mathhandlebrackets(char* expression, bool silent)
bool mathhandlebrackets(char* expression, bool silent, bool baseonly)
{
EXPRESSION expstruct;
expstruct.expression=expression;
@ -345,7 +345,7 @@ bool mathhandlebrackets(char* expression, bool silent)
deepest=expstruct.pairs[i].layer;
for(int i=deepest; i>0; i--)
if(!printlayer(expression, &expstruct, i, silent))
if(!printlayer(expression, &expstruct, i, silent, baseonly))
{
efree(expstruct.pairs, "mathhandlebrackets:expstruct.pairs");
return false;
@ -358,7 +358,7 @@ bool mathhandlebrackets(char* expression, bool silent)
/*
- handle math
*/
bool mathfromstring(const char* string, uint* value, int* value_size, bool* isvar, bool silent)
bool mathfromstring(const char* string, uint* value, bool silent, bool baseonly, int* value_size, bool* isvar)
{
int highestop=0;
int highestop_pos=0;
@ -373,11 +373,7 @@ bool mathfromstring(const char* string, uint* value, int* value_size, bool* isva
}
}
if(!highestop)
{
if(!valfromstring(string, value, value_size, isvar, silent, 0))
return false;
return true;
}
return valfromstring(string, value, silent, baseonly, value_size, isvar, 0);
char* strleft=(char*)emalloc(len+1, "mathfromstring:strleft");
char* strright=(char*)emalloc(len+1, "mathfromstring:strright");
memset(strleft, 0, len+1);
@ -392,7 +388,7 @@ bool mathfromstring(const char* string, uint* value, int* value_size, bool* isva
return false;
}
uint right=0;
if(!valfromstring(strright, &right, 0, 0, silent, 0))
if(!valfromstring(strright, &right, silent, baseonly))
{
efree(strleft, "mathfromstring:strleft");
efree(strright, "mathfromstring:strright");
@ -410,7 +406,7 @@ bool mathfromstring(const char* string, uint* value, int* value_size, bool* isva
}
}
uint left=0;
if(!valfromstring(strleft, &left, 0, 0, silent, 0))
if(!valfromstring(strleft, &left, silent, baseonly))
{
efree(strleft, "mathfromstring:strleft");
efree(strright, "mathfromstring:strright");

View File

@ -6,8 +6,8 @@
int mathisoperator(char ch);
void mathformat(char* text);
bool mathcontains(const char* text);
bool mathhandlebrackets(char* expression, bool silent);
bool mathfromstring(const char* string, uint* value, int* value_size, bool* isvar, bool silent);
bool mathhandlebrackets(char* expression, bool silent, bool baseonly);
bool mathfromstring(const char* string, uint* value, bool silent, bool baseonly, int* value_size, bool* isvar);
bool mathdounsignedoperation(char op, uint left, uint right, uint* result);
bool mathdosignedoperation(char op, sint left, sint right, sint* result);

View File

@ -1119,7 +1119,7 @@ static bool ishexnumber(const char* string)
return true;
}
bool valfromstring(const char* string, uint* value, int* value_size, bool* isvar, bool silent, bool* hexonly)
bool valfromstring(const char* string, uint* value, bool silent, bool baseonly, int* value_size, bool* isvar, bool* hexonly)
{
if(!value)
return false;
@ -1175,12 +1175,12 @@ bool valfromstring(const char* string, uint* value, int* value_size, bool* isvar
int add=0;
while(mathisoperator(string_[add])>2)
add++;
if(!mathhandlebrackets(string_+add, silent))
if(!mathhandlebrackets(string_+add, silent, baseonly))
{
efree(string_, "valfromstring:string_");
return false;
}
bool ret=mathfromstring(string_+add, value, value_size, isvar, silent);
bool ret=mathfromstring(string_+add, value, silent, baseonly, value_size, isvar);
efree(string_, "valfromstring:string_");
return ret;
}
@ -1227,7 +1227,7 @@ bool valfromstring(const char* string, uint* value, int* value_size, bool* isvar
if(new_size<read_size)
read_size=new_size;
}
if(!valfromstring(newstring+add, value, 0, 0, silent, 0))
if(!valfromstring(newstring+add, value, silent, baseonly))
{
efree(newstring, "valfromstring::newstring");
return false;
@ -1312,6 +1312,8 @@ bool valfromstring(const char* string, uint* value, int* value_size, bool* isvar
sscanf(string+inc, "%"fext"x", value);
return true;
}
if(baseonly)
return false;
else if(valapifromstring(string, value, value_size, true, silent, hexonly)) //then come APIs
return true;
else if(labelfromstring(string, value)) //then come labels
@ -1329,6 +1331,21 @@ bool valfromstring(const char* string, uint* value, int* value_size, bool* isvar
return false; //nothing was OK
}
bool valfromstring(const char* string, uint* value, bool silent, bool baseonly)
{
return valfromstring(string, value, silent, baseonly, 0, 0, 0);
}
bool valfromstring(const char* string, uint* value, bool silent)
{
return valfromstring(string, value, silent, false);
}
bool valfromstring(const char* string, uint* value)
{
return valfromstring(string, value, true);
}
bool valtostring(const char* string, uint* value, bool silent)
{
if(!*string or !value)
@ -1372,7 +1389,8 @@ bool valtostring(const char* string, uint* value, bool silent)
read_size=new_size;
}
uint temp;
if(!valfromstring(newstring+add, &temp, 0, 0, silent, 0))
//TODO: check this
if(!valfromstring(newstring+add, &temp, silent, true))
{
efree(newstring, "valfromstring::newstring");
return false;

View File

@ -7,7 +7,10 @@
bool valuesignedcalc();
void valuesetsignedcalc(bool a);
bool valapifromstring(const char* name, uint* value, int* value_size, bool printall, bool silent, bool* hexonly);
bool valfromstring(const char* string, uint* value, int* value_size, bool* isvar, bool silent, bool* hexonly);
bool valfromstring(const char* string, uint* value, bool silent, bool baseonly, int* value_size, bool* isvar, bool* hexonly);
bool valfromstring(const char* string, uint* value, bool silent, bool baseonly);
bool valfromstring(const char* string, uint* value, bool silent);
bool valfromstring(const char* string, uint* value);
bool valflagfromstring(unsigned int eflags, const char* string);
bool valtostring(const char* string, uint* value, bool silent);