Esempio n. 1
0
void RegexHandler::OnHandleDestroy(HandleType_t type, void *object)
{
	RegEx *x = (RegEx *)object;

	x->Clear();
	delete x;
}
Esempio n. 2
0
static cell AMX_NATIVE_CALL regex_free(AMX *amx, cell *params)
{
	cell *c = MF_GetAmxAddr(amx, params[1]);
	int id = *c;
	*c = 0;
	id -= 1;
	if (id >= (int)PEL.length() || id < 0 || PEL[id]->isFree())
	{
		MF_LogError(amx, AMX_ERR_NATIVE, "Invalid regex handle %d", id);
		return 0;
	}

	RegEx *x = PEL[id];
	x->Clear();

	return 1;
}
Esempio n. 3
0
cell match(AMX *amx, cell *params, bool all)
{
	int len;
	const char *str = MF_GetAmxString(amx, params[1], 0, &len);
	const char *regex = MF_GetAmxString(amx, params[2], 1, &len);

	int id = GetPEL();
	RegEx *x = PEL[id];

	char *flags = NULL;
	cell *errorCode;
	int result = 0;

	if (!all)
	{
		if (*params / sizeof(cell) >= 6) // compiled with 1.8's extra parameter
		{
			flags = MF_GetAmxString(amx, params[6], 2, &len);
		}

		result = x->Compile(regex, flags);
		errorCode = MF_GetAmxAddr(amx, params[3]);
	}
	else
	{
		result = x->Compile(regex, params[3]);
		errorCode = MF_GetAmxAddr(amx, params[6]);
	}

	if (!result)
	{
		const char *err = x->mError;
		*errorCode = x->mErrorOffset;
		MF_SetAmxString(amx, params[4], err ? err : "unknown", params[5]);
		return -1;
	}

	int e;

	if (all)
		e = x->MatchAll(str);
	else
		e = x->Match(str);

	if (e == -1)
	{
		/* there was a match error.  destroy this and move on. */
		*errorCode = x->mErrorOffset;
		x->Clear();
		return -2;
	}
	else if (e == 0) 
	{
		*errorCode = 0;
		x->Clear();
		return 0;
	}
	else 
	{
		*errorCode = x->Count();
		if (all)
			return x->Count();
	}

	return id + 1;
}