NOTE: To add a macro parm, simply add to the bolded lines, using them as a template. New macro parms are ONLY required to append text to szOutput, and return the length of their parm (e.g. old i+= value)
First, EQLib_MacroParser.h: ***NEW***
Code: Select all
typedef DWORD (__cdecl *fParmCmd)(PCHAR,PCHAR);
//PMP funcs
extern "C" EQLIB_API DWORD pGetLastFindSlot(PCHAR, PCHAR);
typedef struct _PARMLIST {
CHAR szName[MAX_STRING];
CHAR szFuncName[MAX_STRING];
DWORD (__cdecl *fAddress)(PCHAR, PCHAR);
} PARMLIST, *PPARMLIST;
//PMP globals
BOOL gPMPInit = FALSE;
PARMLIST Parms[] = {
{"getlastfindslot", "pGetLastFindSlot", NULL},
{NULL,NULL,NULL},
};
Code: Select all
[color=red]#include "EQLib.h"[/color]
#include "EQLib_MacroParser.h"
Code: Select all
PCHAR ParseMacroParameter(PSPAWNINFO pChar, PCHAR szOriginal)
{
BOOL FoundNewCmd=FALSE;
CHAR szOutput[MAX_STRING] = {0};
CHAR szVar[MAX_STRING] = {0};
CHAR szTmp[MAX_STRING] = {0};
DWORD i,j,k,l = 0;
PCHARINFO pCharInfo = NULL;
if (NULL == (pCharInfo = GetCharInfo())) return szOriginal;
if (!gPMPInit) {
gPMPInit = TRUE;
DebugSpew("PMP - Setting up Proc Addresses...");
for (l=0; Parms[l].szName[0]; l++) {
Parms[l].fAddress=(fParmCmd)GetProcAddress(ghModule,Parms[l].szFuncName);
DebugSpew("PMP - Parm '%s' - Proc '%s' - Address '%d'",Parms[l].szName, Parms[l].szFuncName, (DWORD)Parms[l].fAddress);
if ((DWORD)&Parms[l].fAddress == NULL) return szOriginal;
}
}
while (strstr(szOriginal,"$")) {
DebugSpew("PMP - Current string - '%s'",szOriginal);
ZeroMemory(szOutput,MAX_STRING);
ZeroMemory(szVar,MAX_STRING);
i=0;
j=0;
strncpy(szOutput,szOriginal,MAX_STRING);
for (i=0;i<strlen(szOriginal);i++) {
if (szOriginal[i] == '$') j=i;
}
for (i=j;i<strlen(szOriginal);i++) {
szOutput[i]=0;
};
for (i=j;i<strlen(szOriginal);i++) {
if (szOriginal[i] != '$') {
szOutput[j] = szOriginal[i];
j++;
} else {
i++;
if ((szOriginal[i]==0) || (szOriginal[i]==' ')) {
DebugSpew("PMP - Bad $ '%s'",szVar);
i--;
szOutput[j] = '@';
j++;
} else {
GetArg(szVar,szOriginal+i,1,TRUE,TRUE);
_strlwr(szVar);
DebugSpew("PMP - Current param - '%s'",szVar);
FoundNewCmd = FALSE;
[color=orange] for (k=0;Parms[k].szName[0]!='\0';k++) {
if ((!strncmp(szVar,Parms[k].szName,strlen(Parms[k].szName)))
&& ((DWORD)&Parms[k].fAddress)) {
l = Parms[k].fAddress(szVar,szOutput);
if (l==10000) {
i--;
szOutput[j]='@';
j++;
FoundNewCmd=TRUE;
break;
}
i += l;
j += (strlen(szOutput)-j);
FoundNewCmd=TRUE;
break;
}
}
[/color] if (FoundNewCmd) {
// $cursor(xxx)
} else if (!strncmp("cursor(",szVar,7)) {
Code: Select all
DWORD pGetLastFindSlot(PCHAR szVar, PCHAR szOutput)
{
// $getlastfindslot
if (gLastFindSlot[0] == 0) {
strcat(szOutput,"NULL");
} else {
strcat(szOutput,gLastFindSlot);
}
return 14;
}EDIT: changed it to use globals and only initialize the func addresses once.
EDIT: Code in orange has changed to allow for bad parameter return value. return 10000 for a bad $parm.


