// native regex_substr(Regex:id, str_id, buffer[], maxLen); static cell AMX_NATIVE_CALL regex_substr(AMX *amx, cell *params) { int id = params[1]-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]; static char buffer[16384]; // Same as AMXX buffer. size_t length; size_t maxLength = ke::Min<size_t>(params[4], sizeof(buffer) - 1); const char *ret = x->GetSubstring(params[2], buffer, maxLength, &length); if (ret == NULL) { return 0; } if (length >= maxLength && ret[length - 1] & 1 << 7) { maxLength -= UTIL_CheckValidChar((char *)ret + length - 1); } MF_SetAmxString(amx, params[3], ret, maxLength); return 1; }
static cell_t GetRegexSubString(IPluginContext *pCtx, const cell_t *params) { Handle_t hndl=static_cast<Handle_t>(params[1]); HandleError err; HandleSecurity sec; sec.pOwner=NULL; sec.pIdentity=myself->GetIdentity(); int match = 0; RegEx *x; if ((err=g_pHandleSys->ReadHandle(hndl, g_RegexHandle, &sec, (void **)&x)) != HandleError_None) { return pCtx->ThrowNativeError("Invalid regex handle %x (error %d)", hndl, err); } if (!x) { pCtx->ThrowNativeError("Regex data not found\n"); return 0; } if (params[0] >= 5) { match = params[5]; } if(match >= x->mMatchCount || match < 0) return pCtx->ThrowNativeError("Invalid match index passed.\n"); char *buffer; pCtx->LocalToString(params[3], &buffer); return x->GetSubstring(params[2], buffer, params[4], match); }