Skip to content

Commit

Permalink
1. MCTL_GETLASTERROR можно теперь вызывать и после исполнения MSSC_PO…
Browse files Browse the repository at this point in the history
…ST и MCTL_EXECSTRING.

2. MCTL_EXECSTRING теперь учитывает флаг KMFLAGS_SILENTCHECK.
  • Loading branch information
shmuz committed Aug 24, 2017
1 parent 015a51a commit 8fd33ae
Show file tree
Hide file tree
Showing 12 changed files with 74 additions and 35 deletions.
5 changes: 3 additions & 2 deletions enc/enc_rus3.work/meta/service_functions/macrocontrol.html
Expand Up @@ -68,7 +68,7 @@ <h1>MacroControl</h1>
<tr class="cont"><td class="cont" width="40%"><a name="MSSC_CHECK">MSSC_CHECK</a></td>
<td class="cont" width="60%">Ïðîâåðèòü ìàêðîñ.<br>
<code>Param2</code> óêàçûâàåò íà ñòðóêòóðó <a href="../structures/macrosendmacrotext.html">MacroSendMacroText</a>. Ôóíêöèÿ ïðè íåóäà÷å âåðí¸ò <code>FALSE</code>.
 ñëó÷àå íåóäà÷è, ìîæíî ïîëó÷èòü ðàñøèðåííóþ äèàãíîñòèêó îá îøèáêå ñ ïîìîùüþ êîìàíäû <a href="#MCTL_GETLASTERROR">MCTL_GETLASTERROR</a></td></tr>
</td></tr>
</table>

<tr class="cont"><td class="cont" width="40%"><a name="MCTL_EXECSTRING">MCTL_EXECSTRING</a></td>
Expand All @@ -78,7 +78,8 @@ <h1>MacroControl</h1>
Ôóíêöèÿ ïðè íåóäà÷å âåðí¸ò <code>FALSE</code>.</td></tr>

<tr class="cont"><td class="cont" width="40%"><a name="MCTL_GETLASTERROR">MCTL_GETLASTERROR</a></td>
<td class="cont" width="60%">Ïîëó÷èòü ðàñøèðåííóþ äèàãíîñòèêó îá îøèáêå ïðîâåðêè ìàêðîñà (<code>MSSC_CHECK</code>).<br>
<td class="cont" width="60%">Ïîëó÷èòü ðàñøèðåííóþ äèàãíîñòèêó îá îøèáêå ïðîâåðêè ìàêðîñà èëè ñêðèïòà
(ïîñëå èñïîëíåíèÿ êîìàíäû <a href="#MCTL_SENDSTRING"><code>MCTL_SENDSTRING</code></a> èëè <a href="#MCTL_EXECSTRING"><code>MCTL_EXECSTRING</code></a>).<br>
<code>Param1</code> ðàçìåð áóôåðà. Óêàçûâàåò ìàêñèìàëüíîå êîëè÷åñòâî áàéò, êîòîðûå ìîãóò áûòü çàïèñàíû â <code>Param2</code>.<br>
<code>Param2</code> óêàçàòåëü íà áóôåð, ñòðóêòóðó <a href="../structures/macroparseresult.html">MacroParseResult</a>, ïàìÿòü ïëàãèí âûäåëÿåò ñàìîñòîÿòåëüíî.<br>
Ôóíêöèÿ âîçâðàùàåò ðàçìåð òðåáóåìîãî áóôåðà, ïðè <code>Param2 = NULL</code>.</td></tr>
Expand Down
2 changes: 1 addition & 1 deletion enc/enc_rus3.work/meta/structures/macroexecutestring.html
Expand Up @@ -37,7 +37,7 @@ <h1>MacroExecuteString</h1>
<div class=dfn>StructSize</div>
<div class=dfndescr>Ýòî ïîëå äîëæíî ñîäåðæàòü ðàçìåð ñòðóêòóðû <code>MacroExecuteString</code>. Ïåðåä èñïîëüçîâàíèåì ñòðóêòóðû ïëàãèí äîëæåí çàïîëíèòü ïîëå.</div>
<div class=dfn>Flags</div>
<div class=dfndescr>Êîìáèíàöèÿ ôëàãîâ (òèï <code><a name="FARKEYMACROFLAGS">FARKEYMACROFLAGS</a></code>, èñïîëüçóþòñÿ òîëüêî KMFLAGS_LUA è KMFLAGS_MOONSCRIPT):
<div class=dfndescr>Êîìáèíàöèÿ ôëàãîâ (òèï <code><a name="FARKEYMACROFLAGS">FARKEYMACROFLAGS</a></code>, èñïîëüçóþòñÿ òîëüêî KMFLAGS_SILENTCHECK, KMFLAGS_LUA è KMFLAGS_MOONSCRIPT):
<table class="cont">
<tr class="cont"><th class="cont" width="40%">Ôëàã</th><th class="cont" width="60%">Îïèñàíèå</th></tr>
<tr class="cont"><td class="cont" width="40%"><a name="KMFLAGS_ENABLEOUTPUT">KMFLAGS_ENABLEOUTPUT</a></td>
Expand Down
6 changes: 6 additions & 0 deletions far/changelog
@@ -1,3 +1,9 @@
shmuel 24.08.2017 15:16:45 +0200 - build 5013

1. MCTL_GETLASTERROR можно теперь вызывать и после исполнения MSSC_POST и MCTL_EXECSTRING.

2. MCTL_EXECSTRING теперь учитывает флаг KMFLAGS_SILENTCHECK.

shmuel 23.08.2017 12:57:35 +0200 - build 5012

1. Флаг KMFLAGS_SILENTCHECK игнорировался в команде MSSC_POST.
Expand Down
30 changes: 18 additions & 12 deletions far/macro.cpp
Expand Up @@ -492,7 +492,6 @@ KeyMacro::KeyMacro():
m_Area(MACROAREA_SHELL),
m_StartMode(MACROAREA_OTHER),
m_Recording(MACROSTATE_NOMACRO),
m_LastErrorLine(0),
m_InternalInput(0),
m_WaitKey(0),
m_StringToPrint()
Expand Down Expand Up @@ -1292,14 +1291,10 @@ bool KeyMacro::ParseMacroString(const wchar_t* Sequence, FARKEYMACROFLAGS Flags,
{
if (info.Ret.ReturnType == MPRT_NORMALFINISH)
{
m_LastErrorStr.clear();
m_LastErrorLine = 0;
return true;
}
if (info.Ret.ReturnType == MPRT_ERRORPARSE)
else if (info.Ret.ReturnType == MPRT_ERRORPARSE)
{
m_LastErrorStr = info.Ret.Values[0].String;
m_LastErrorLine = (int)info.Ret.Values[1].Double;
if (!onlyCheck)
{
RestoreMacroChar();
Expand All @@ -1312,7 +1307,8 @@ bool KeyMacro::ParseMacroString(const wchar_t* Sequence, FARKEYMACROFLAGS Flags,

bool KeyMacro::ExecuteString(MacroExecuteString *Data)
{
FarMacroValue values[]={GetMacroLanguage(Data->Flags), Data->SequenceText, FarMacroValue(Data->InValues,Data->InCount)};
bool onlyCheck = (Data->Flags & KMFLAGS_SILENTCHECK) != 0;
FarMacroValue values[]={GetMacroLanguage(Data->Flags), Data->SequenceText, FarMacroValue(Data->InValues,Data->InCount), onlyCheck};
FarMacroCall fmc={sizeof(FarMacroCall),std::size(values),values,nullptr,nullptr};
OpenMacroPluginInfo info={MCT_EXECSTRING,&fmc};

Expand All @@ -1326,12 +1322,22 @@ bool KeyMacro::ExecuteString(MacroExecuteString *Data)
return false;
}

void KeyMacro::GetMacroParseError(DWORD* ErrCode, COORD* ErrPos, string *ErrSrc) const
DWORD KeyMacro::GetMacroParseError(COORD* ErrPos, string& ErrSrc) const
{
*ErrCode = m_LastErrorStr.empty()? MPEC_SUCCESS : MPEC_ERROR;
ErrPos->X = 0;
ErrPos->Y = static_cast<SHORT>(m_LastErrorLine);
*ErrSrc = m_LastErrorStr;
MacroPluginReturn Ret;
if (MacroPluginOp(11.0, false, &Ret))
{
ErrSrc = Ret.Values[0].String;
ErrPos->Y = static_cast<SHORT>(Ret.Values[1].Double);
ErrPos->X = static_cast<SHORT>(Ret.Values[2].Double);
return ErrSrc.empty() ? MPEC_SUCCESS : MPEC_ERROR;
}
else
{
ErrSrc = L"No response from macro plugin";
ErrPos->Y = ErrPos->X = 0;
return MPEC_ERROR;
}
}

static bool absFunc(FarMacroCall*);
Expand Down
4 changes: 1 addition & 3 deletions far/macro.hpp
Expand Up @@ -88,7 +88,7 @@ class KeyMacro: noncopyable
bool CheckWaitKeyFunc() const;
int GetState() const;
int GetKey();
void GetMacroParseError(DWORD* ErrCode, COORD* ErrPos, string *ErrSrc) const;
DWORD GetMacroParseError(COORD* ErrPos, string& ErrSrc) const;
FARMACROAREA GetArea() const { return m_Area; }
const wchar_t* GetStringToPrint() const { return m_StringToPrint; }
bool IsRecording() const { return m_Recording != MACROSTATE_NOMACRO; }
Expand All @@ -112,8 +112,6 @@ class KeyMacro: noncopyable
FARMACROSTATE m_Recording;
string m_RecCode;
string m_RecDescription;
string m_LastErrorStr;
int m_LastErrorLine;
int m_InternalInput;
int m_WaitKey;
const wchar_t* m_StringToPrint;
Expand Down
5 changes: 2 additions & 3 deletions far/plugapi.cpp
Expand Up @@ -1275,7 +1275,7 @@ intptr_t WINAPI apiPanelControl(HANDLE hPlugin,FILE_CONTROL_COMMANDS Command,int
Global->CtrlObject->Desktop->ConsoleSession().EnterPluginContext();
return TRUE;
}

if (Command == FCTL_SETUSERSCREEN)
{
Global->CtrlObject->Desktop->ConsoleSession().LeavePluginContext();
Expand Down Expand Up @@ -2467,11 +2467,10 @@ intptr_t WINAPI apiMacroControl(const GUID* PluginId, FAR_MACRO_CONTROL_COMMANDS
//Param1=size of buffer, Param2 - MacroParseResult*
case MCTL_GETLASTERROR:
{
DWORD ErrCode = MPEC_SUCCESS;
COORD ErrPos = {};
string ErrSrc;

Macro.GetMacroParseError(&ErrCode, &ErrPos, &ErrSrc);
DWORD ErrCode = Macro.GetMacroParseError(&ErrPos, ErrSrc);

int Size = aligned_sizeof<MacroParseResult>();
size_t stringOffset = Size;
Expand Down
2 changes: 1 addition & 1 deletion far/vbuild.m4
@@ -1 +1 @@
m4_define(BUILD,5012)m4_dnl
m4_define(BUILD,5013)m4_dnl
4 changes: 2 additions & 2 deletions plugins/luamacro/_globalinfo.lua
@@ -1,7 +1,7 @@
function export.GetGlobalInfo()
return {
Version = { 1, 0, 0, 614 },
MinFarVersion = { 3, 0, 0, 5012 },
Version = { 1, 0, 0, 615 },
MinFarVersion = { 3, 0, 0, 5013 },
Guid = win.Uuid("4EBBEFC8-2084-4B7F-94C0-692CE136894D"),
Title = "LuaMacro",
Description = "Far macros in Lua",
Expand Down
10 changes: 8 additions & 2 deletions plugins/luamacro/changelog
@@ -1,6 +1,12 @@
shmuel 23.08.2017 13:06:35 +0200 - build 614
shmuel 24.08.2017 15:16:45 +0200 - build 615

1. Флаг KMFLAGS_SILENTCHECK игнорировался в команде MCCS_POST.
1. MCTL_GETLASTERROR можно теперь вызывать и после исполнения MSSC_POST и MCTL_EXECSTRING.

2. MCTL_EXECSTRING теперь учитывает флаг KMFLAGS_SILENTCHECK.

shmuel 23.08.2017 13:06:35 +0200 - build 614

1. Флаг KMFLAGS_SILENTCHECK игнорировался в команде MSSC_POST.

shmuel 17.08.2017 16:44:24 +0200 - build 613

Expand Down
4 changes: 4 additions & 0 deletions plugins/luamacro/keymacro.lua
Expand Up @@ -6,6 +6,7 @@ local MacroInit, MacroStep = Shared.MacroInit, Shared.MacroStep
local pack, loadmacro, utils = Shared.pack, Shared.loadmacro, Shared.utils
local MacroCallFar = Shared.MacroCallFar
local FarMacroCallToLua = Shared.FarMacroCallToLua
local GetLastParseError = Shared.GetLastParseError
Shared = nil

local F = far.Flags
Expand Down Expand Up @@ -416,6 +417,7 @@ local OP_POSTNEWMACRO = 7
local OP_SETMACROVALUE = 8
local OP_GETINPUTFROMMACRO = 9
local OP_TRYTOPOSTMACRO = 10
local OP_GETLASTERROR = 11

function KeyMacro.Dispatch (opcode, ...)
local p1 = (...)
Expand Down Expand Up @@ -450,6 +452,8 @@ function KeyMacro.Dispatch (opcode, ...)
if m then m:SetValue(p1) end
elseif opcode == OP_TRYTOPOSTMACRO then
return TryToPostMacro(...)
elseif opcode == OP_GETLASTERROR then
return GetLastParseError()
end
end

Expand Down
35 changes: 27 additions & 8 deletions plugins/luamacro/luamacro.lua
Expand Up @@ -14,6 +14,7 @@ local co_yield, co_resume, co_status = coroutine.yield, coroutine.resume, corout
local PROPAGATE={} -- a unique value, inaccessible to scripts.
local gmeta = { __index=_G }
local LastMessage
local strParseError = ""
local Shared
local TablePanelSort -- must be separate from LastMessage, otherwise Far crashes after a macro is called from CtrlF12.
local TableExecString -- must be separate from LastMessage, otherwise Far crashes
Expand Down Expand Up @@ -179,18 +180,21 @@ local function loadmacro (Lang, Text, Env, ConvertPath)
if fname then
fname = ConvertPath and far.ConvertPath(fname, F.CPM_NATIVE) or fname
f2,msg = _loadstring("return "..params)
if not f2 then return nil,msg end
f1,msg = _loadfile(fname)
if f2 then
f1,msg = _loadfile(fname)
end
else
f1,msg = _loadstring(Text)
end

if f1 then
strParseError = ""
Env = Env or setmetatable({_filename=fname}, gmeta)
setfenv(f1, Env)
if f2 then setfenv(f2, Env) end
return f1,f2
else
strParseError = msg
return nil,msg
end
end
Expand Down Expand Up @@ -278,24 +282,30 @@ local function MacroParse (Lang, Text, onlyCheck, skipFile)
end

if ok then
strParseError = ""
return F.MPRT_NORMALFINISH
else
strParseError = msg
if not onlyCheck then
far.Message(msg, Msg.MMacroParseErrorTitle, Msg.MOk, "lw")
end
LastMessage = pack(msg, tonumber(msg:match(":(%d+): ")) or 0)
return F.MPRT_ERRORPARSE, LastMessage
return F.MPRT_ERRORPARSE
end
end

local function ExecString (lang, text, params)
local function GetLastParseError()
LastMessage = pack(strParseError, tonumber(strParseError:match(":(%d+): ")) or 0, 0)
return LastMessage
end

local function ExecString (lang, text, params, onlyCheck)
if type(text)=="string" then
local chunk, msg = loadmacro(lang, text)
if chunk then
TableExecString = pack(chunk(unpack(params,1,params.n)))
return F.MPRT_NORMALFINISH, TableExecString
else
ErrMsg(msg)
if not onlyCheck then ErrMsg(msg) end
TableExecString = { msg }
return F.MPRT_ERRORPARSE, TableExecString
end
Expand Down Expand Up @@ -451,8 +461,17 @@ local function AddCfindFunction()
end

local function Init()
Shared = { ErrMsg=ErrMsg, pack=pack, checkarg=checkarg, loadmacro=loadmacro, yieldcall=yieldcall,
MacroInit=MacroInit, MacroStep=MacroStep, ExpandEnv=ExpandEnv }
Shared = {
ErrMsg = ErrMsg,
ExpandEnv = ExpandEnv,
GetLastParseError = GetLastParseError,
MacroInit = MacroInit,
MacroStep = MacroStep,
checkarg = checkarg,
loadmacro = loadmacro,
pack = pack,
yieldcall = yieldcall,
}
Shared.MacroCallFar, far.MacroCallFar = far.MacroCallFar, nil
Shared.FarMacroCallToLua, far.FarMacroCallToLua = far.FarMacroCallToLua, nil

Expand Down
2 changes: 1 addition & 1 deletion plugins/luamacro/luamacro.rc
@@ -1,6 +1,6 @@
#include <farversion.hpp>

#define PLUGIN_BUILD 614
#define PLUGIN_BUILD 615
#define PLUGIN_DESC "Lua Macros for Far Manager"
#define PLUGIN_NAME "LuaMacro"
#define PLUGIN_FILENAME "luamacro.dll"
Expand Down

0 comments on commit 8fd33ae

Please sign in to comment.