Ru-Board.club
← Вернуться в раздел «Тестирование»

» Far Manager - скрипты и плагины

Автор: Angel_Ka
Дата сообщения: 11.05.2016 20:59

Цитата:
Там уже 12.8.2

Хор. Микротест пройдёт быстро.
Автор: Alexyz21
Дата сообщения: 11.05.2016 21:04
Если к правильности работы скрипта вопросов нет, то можно считать его завершённым, осталось только удалить лишние определения, накопившиеся в ходе опробования различных функций сравнений строк и подчистить код. В коде есть один потенциально тормозной момент, причём в цикле по всем элементам панели - ToWChar(panel.GetPanelItem(nil,1,i).FileName), но с этим я помочь не в силах - это вы либо решаете с маэстро, либо пользуетесь как есть.
Автор: Angel_Ka
Дата сообщения: 11.05.2016 21:08
Микротест пройден на отлично.

Добавлено:

Цитата:
В коде есть один потенциально тормозной момент, причём в цикле по всем элементам панели - ToWChar(panel.GetPanelItem(nil,1,i).FileName),

Полагаю, что в этом я совсем слаб. Ну а если кратко, то в чём там дело?
Автор: Alexyz21
Дата сообщения: 11.05.2016 21:28
В этой маленькой строчке сокрыты (возможно большие, возможно не столь уж и большие) тормоза - мы получаем FullPath в Utf8, затем конвертируем его в Utf16, и получаем на эту строку указатель, чтобы можно было работать с юникодными функциями сравнения. И это помимо того, что panel.GetPanelItem(nil,1,i).FileName конструкция LuaMacro, который сам обращается к FAR API. Потенциально быстрее было бы обращаться из скрипта к FAR API, получая указатели на FullPath в Utf16 напрямую. Но всё это лишь теория, а на практике кто его знает, будет выигрыш или нет. Но когда операция выполняется 1.800.000 раз, то, наверное, надо думать об оптимизации крепко.
Автор: Angel_Ka
Дата сообщения: 11.05.2016 21:44
Alexyz21
Да, это действительно кратко. И для меня, как я и предполагал, весьма смутно — тут мне ни познаний, ни опыта недостаёт. Только туманное ощущение, что речь идёт о некой двойной работе, которую может быть и можно было бы делать напрямую, т.е. быстрее.

Попытаемся спросить у знатоков, и будем надеяться на то, что кто то из круга любителей Фара заинтересуется и сможет помочь в этом деле, либо, если это дело в принципе не перспективно, пояснить в чём затык.
Автор: VictorVG4
Дата сообщения: 11.05.2016 22:18
Angel_Ka

Внутри Far работает с UTF-16, а перед передачей результата наружу конвертирует его в заданную кодировку. А это задержка - по коду прочитать символ из таблицы UTF-16, после отыскать его в другой и считать его код там. Время.
Автор: Angel_Ka
Дата сообщения: 11.05.2016 23:41
VictorVG4
Большое спасибо! Я очень рад, что Вы солидарны в этом вопросе с Alexyz21 и поскольку это так, прошу Вас, по возможности, поддержать и мою солидарность с ним тоже, выраженную в обращении к знатокам и любителям Фара. Вместе нам будет сподручнее убеждать спецов в полезности и необходимости оптимизации.
Автор: VictorVG4
Дата сообщения: 12.05.2016 02:11
Angel_Ka

Никого тут убеждать не надо. Чтобы разобраться в чужом или забытом своём алгоритме нужно время, а его у всех катастрофически не хватает. Но обычно находится кто-то кому предложенная задача интересна и он сам подключается к её решению, ну а если таких людей нет тут одно из двух - или задача слишком специфична или ни у кого потребности в её решении не возникло.

А что до солидарности - так то, что Far как и любая UNICODE программа внутри работает с UTF-16 LE ни для кого не секрет с момента появления Windows NT 3.1. Это Win16/32s, Win9x/ME (платформа Win32c) работали в ANSI, а все ОС платформы WINNT (Win32/Win64) с момента её появления производят внутреннюю обработку данных в UNICODE UTF-16 LE, а ANSI в ней это наследство созданной в начале 70-х однозадачной ОС CP/M (сильно урезанная версия более ранней многозадачной ОС для микроЭВМ МР/М) возможности которой дополнительно ещё сильнее урезали как в плане набора команд, так и поддерживаемого объёма и механизма управления памятью, а полученную ОС назвали QDOS (позднее 86-DOS), а позднее купив её под именем PC DOS Микрософт просто переименовала её в MS DOS выдав чужую разработку за свою собственную кою якобы "гениальный дядя Стиви" за три дня в гараже под музыку с перерывом на пиво и девочек на газетке написал. Так что корни ANSI в седую старину уходят, а мелкомягкие - а они всегда умели только коробочки клеить ибо им более не дано.
Автор: Angel_Ka
Дата сообщения: 12.05.2016 05:02
VictorVG4

Цитата:
нужно время, а его у всех катастрофически не хватает

Это вполне понятно. Просто если обоснованно не попросить, то время для помощи так никогда и не найдётся, потому что и искаться не будет. А так может хотя бы со временем... Благодарю Вас за моральную поддержку! На самом деле это действительно много значит. БОЛЬШОЕ СПАСИБО Вам за Вашу неустанную очень полезную деятельность на сайте!

Добавлено:
shmuz2

Посмотрел LuaFAR Search (версия 3.26.2).

Цитата:
Search from panels: add "The search is over, please wait..." message box.






Конечно так лучше, сами, согласитесь. И БОЛЬШОЕ СПАСИБО Вам за то, что реализуете чаяния простого пользователя!

Кроме того макросом от Alexyz21 я измерил время нахождения дубликатов имён файлов на панелях двух Ваших плагинов, и получил следующие результаты:
Код: LF Search: временная панель: mcs: 20 338 518 mcs: 19 210 372 mcs: 19 638 536

Врем. панель (LuaFAR): mcs: 13 966 476 mcs: 14 041 200 mcs: 13 996 029
Автор: shmuz2
Дата сообщения: 12.05.2016 09:28
Angel_Ka
Режим сортировки панели можно задать в установках панели результатов поиска плагина LF Search. Попробуйте установить там 2,0 (сортировка по имени). Если хотите, чтобы был тот же режим сортировки, что был перед началом поиска, установите 0,0.

Всем, кому интересно
Пароль, о котором говорилось выше: 2016-05-05-privet
Чтобы закрыть этот вопрос.
Автор: Alexyz21
Дата сообщения: 12.05.2016 11:00
12.9 [more]
Код: local F = far.Flags
local ffi = require'ffi'
local C = ffi.C

local PanelMode,Desc1,Indi1 = 999,"Select duplicates","!?"
local guid = "FE9B8874-9651-434C-8182-72329F2371A5"
local uGuid = win.Uuid(guid)
local BS,ts = string.byte("\\"),{nil,true,9999,true,true,false,false,false}
local freport = win.GetEnv("Temp").."\\Report.txt"

ffi.cdef[[
int StrCmpW(const wchar_t*, const wchar_t*);
int StrCmpIW(const wchar_t*, const wchar_t*);
int wcscmp(const wchar_t*, const wchar_t*);
int _wcsicmp(const wchar_t*, const wchar_t*);
int wcsncmp(const wchar_t*, const wchar_t*, size_t);
int _wcsnicmp(const wchar_t*, const wchar_t*, size_t);
int strcmp(const char*, const char*);
int _stricmp(const char*, const char*);
int _strnicmp(const char*, const char*, size_t);
int strncmp(const char*, const char*, size_t);
char* strrchr(const char*, int);
size_t strlen(const char*);
int memcmp(const void*, const void*, size_t);
wchar_t* wmemcpy(wchar_t*, const wchar_t*, size_t);
]]

local function ToWChar(str)
str=win.Utf8ToUtf16(str)
local res=ffi.new("wchar_t[?]",#str/2+1)
ffi.copy(res,str)
return res
end

local function GetStartAndLenW(name)
local ptr = C.wcsrchr(name,BS)
name = ptr==nil and name or ptr+1
local len = tonumber(C.wcslen(name))
if ts[2] and ts[3]<0 and -ts[3]<len then
local res=ffi.new("wchar_t[?]",len+1)
ffi.copy(res,name+len+ts[3],-ts[3]*2)
ffi.copy(res-ts[3],name,(len+ts[3])*2)
return res,len
else
return name,len
end
end

local function StartAndLenW(name)
local ptr = C.wcsrchr(name,BS)
name = ptr==nil and name or ptr+1
local len = tonumber(C.wcslen(name))
if ts[2] and ts[3]<0 and -ts[3]<len then
return name+len+ts[3],-ts[3],name,len
elseif ts[2] and ts[3]>0 and ts[3]<len then
return name,ts[3],name,len
else
return name,len,name,len
end
end

local Compare = function(p1,p2,opt)
local st1,ln1 = GetStartAndLenW(p1.FileName)
local st2,ln2 = GetStartAndLenW(p2.FileName)
return ts[4] and C._wcsicmp(st1,st2) or C.wcscmp(st1,st2)
end

local function StartAndLen(name)
local ptr = C.strrchr(name,BS)
name = ptr==nil and name or ptr+1
local len = tonumber(C.strlen(name))
if ts[2] and ts[3]<0 and -ts[3]<len then
return name+len+ts[3],-ts[3],name,len
elseif ts[2] and ts[3]>0 and ts[3]<len then
return name,ts[3],name,len
else
return name,len,name,len
end
end

local Items = {
--[[01]] {F.DI_DOUBLEBOX, 3,1, 65,8, 0, 0,0, 0, "Select duplicates of FileName. Help: F1"},
--[[02]] {F.DI_CHECKBOX, 5,2, 26,2, 0, 0,0, 0, "Num&ber of symbols"},
--[[03]] {F.DI_EDIT, 27,2, 32,2, 0, 0,0, 0, ""},
--[[04]] {F.DI_CHECKBOX, 5,3, 20,3, 0, 0,0, 0, "Ignore &case"},
--[[05]] {F.DI_CHECKBOX, 37,3, 56,3, 0, 0,0, 0, "Ignore &full duplicates"},
--[[06]] {F.DI_CHECKBOX, 5,4, 47,4, 0, 0,0, 0, "Full duplicates should be the same &size"},
--[[07]] {F.DI_CHECKBOX, 5,5, 53,5, 0, 0,0, 0, "Full duplicates should be the same &attributes"},
--[[08]] {F.DI_CHECKBOX, 5,7, 15,7, 0, 0,0, 0, "Re&port"},
--[[09]] {F.DI_TEXT, -1,6, 0,0, 0, 0,0, F.DIF_SEPARATOR,""},
--[[10]] {F.DI_BUTTON, 0,7, 0,0, 0, 0,0, F.DIF_DEFAULTBUTTON+F.DIF_CENTERGROUP,"&Ok"},
--[[11]] {F.DI_BUTTON, 0,7, 0,0, 0, 0,0, F.DIF_CENTERGROUP,"Ca&ncel"}
}

local tts={}

local function DlgProc(hDlg,Msg,Param1,Param2)
if Msg==F.DN_INITDIALOG then
for i=2,#Items-3 do tts[i]=ts[i] end
hDlg:send(F.DM_SETTEXT,3,tts[3])
hDlg:send(F.DM_SETCHECK,2,tts[2] and F.BSTATE_CHECKED or F.BSTATE_UNCHECKED)
for j=4,8 do
hDlg:send(F.DM_SETCHECK,j,tts[j] and F.BSTATE_CHECKED or F.BSTATE_UNCHECKED)
end
elseif Msg==F.DN_BTNCLICK and (Param1==2 or Param1>=4 and Param1<=8) then
tts[Param1] = Param2~=0
elseif Msg==F.DN_EDITCHANGE and Param1==3 then -- Number symbols
tts[3] = tonumber(hDlg:send(F.DM_GETTEXT,3)) or tts[3]
else
return
end
return true
end

Macro {
description="! Select Duplicates FileName in Branch panel"; name="SDFN"; area="Shell";
action=function()
if far.Dialog(uGuid,-1,-1,69,10,nil,Items,nil,DlgProc)==#Items-1 then
local t0=far.FarClock()
for i=2,#Items-3 do ts[i]=tts[i] end
local pBL0,pBL1 = ffi.cast("BOOL*",0),ffi.cast("BOOL*",1)
local pc=ffi.cast("struct PluginStartupInfo*",far.CPluginStartupInfo()).PanelControl
--local PInfo=panel.GetPanelInfo(nil,1)
local PInfo=ffi.new("struct PanelInfo")
PInfo.StructSize=ffi.sizeof(PInfo)
if pc(PANEL_ACTIVE,"FCTL_GETPANELINFO",0,PInfo)==1 then
local pin,pif = tonumber(PInfo.ItemsNumber),tonumber(PInfo.Flags)
if pin>1 then
if bit.band(pif,F.PFLAGS_SELECTEDFIRST)>0 then Keys("ShiftF12") end
if bit.band(pif,F.PFLAGS_NUMERICSORT)>0 then pc(PANEL_ACTIVE,"FCTL_SETNUMERICSORT",0,nil) end
local pfcss=bit.band(pif,F.PFLAGS_CASESENSITIVESORT)==0
if ts[4] and not pfcss or not ts[4] and pfcss then pc(PANEL_ACTIVE,"FCTL_SETCASESENSITIVESORT",ts[4] and 0 or 1,nil) end
if bit.band(pif,F.PFLAGS_REVERSESORTORDER)==0 then pc(PANEL_ACTIVE,"FCTL_SETSORTORDER",1,nil) end
Panel.LoadCustomSortMode(PanelMode,{Description=Desc1;Indicator=Indi1;Compare=Compare})
Panel.SetCustomSortMode(PanelMode,0)
local full,tsel,fn0,fn1,fn2,fn3,st0,ln0,st1,ln1,st2,ln2,st3,ln3,sz0,sz1,fa0,fa1 = false,{},"","","","",0,0,0,0,0,0,0,0,0,0,"",""
local function Comp(stA,lnA,stB,lnB)
return ts[4] and C._wcsicmp(stA,stB) or C.wcscmp(stA,stB)
end
local function Proc(i,x)
if ts[5] and x then
if full then
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-1,pBL0)
else
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-2,pBL0)
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-1,pBL0)
full=true
end
else
if #tsel==0 or Comp(tsel[#tsel][2],tsel[#tsel][3],st1,ln1)~=0 then
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-2,pBL1)
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-1,pBL1)
table.insert(tsel,{2,st1,ln1,win.Utf16ToUtf8(ffi.string(st1,ln1*2))})
else
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-1,pBL1)
tsel[#tsel][1]=tsel[#tsel][1]+1
end
full=false
end
end
st1,ln1,st3,ln3=StartAndLenW(ToWChar(panel.GetPanelItem(nil,1,1).FileName))
if ts[6] then sz1=panel.GetPanelItem(nil,1,1).FileSize end
if ts[7] then fa1=panel.GetPanelItem(nil,1,1).FileAttributes end
pc(PANEL_ACTIVE,"FCTL_BEGINSELECTION",0,nil)
for i=2,pin do
st0,ln0,st2,ln2,sz0,fa0 = st1,ln1,st3,ln3,sz1,fa1
st1,ln1,st3,ln3=StartAndLenW(ToWChar(panel.GetPanelItem(nil,1,i).FileName))
if ts[6] then sz1=panel.GetPanelItem(nil,1,i).FileSize end
if ts[7] then fa1=panel.GetPanelItem(nil,1,i).FileAttributes end
if ts[4] and (ts[2] and C._wcsnicmp(st1,st0,ts[3])==0 or C._wcsicmp(st1,st0)==0) then Proc(i,C._wcsicmp(st3,st2)==0 and not (ts[6] and sz1~=sz0) and not (ts[7] and fa1~=fa0))
elseif not ts[4] and (ts[2] and C.wcsncmp(st1,st0,ts[3])==0 or C.wcscmp(st1,st0)==0) then Proc(i,C.wcscmp(st3,st2)==0 and not (ts[6] and sz1~=sz0) and not (ts[7] and fa1~=fa0))
end
end
pc(PANEL_ACTIVE,"FCTL_ENDSELECTION",0,nil)
pc(PANEL_ACTIVE,"FCTL_REDRAWPANEL",0,nil)
--Keys("ShiftF12")
if ts[8] then
table.sort(tsel,function(a,b) return a[1]<b[1] end)
local h = io.open(freport,"wb")
io.close(h)
h = io.open(freport,"ab")
h:write(
"Items: "..#tsel..
"\nExecution time: "..(far.FarClock()-t0)..
" mcs\nNumber of symbols: "..(ts[2] and ts[3] or "all")..
"\nIgnore case: "..tostring(ts[4])..
"\nIgnore full duplicates: "..tostring(ts[5])..
"\nFull duplicates should be the same size: "..tostring(ts[6])..
"\nFull duplicates should be the same attributes: "..tostring(ts[7])..
"\n\n"
)
for i=#tsel,1,-1 do h:write(tsel[i][1].."\t"..tsel[i][4].."\n") table.remove(tsel) end
io.close(h)
far.Message("mcs: "..far.FarClock()-t0,"SDFN")
end
end
end
end
end;
}

Macro {
description = "SDFN - Help"; area = "Dialog"; key = "F1";
condition=function() return Area.Dialog and Dlg.Id==guid end;
action=function()
if Dlg.CurPos<=3 then far.Message("The number of first or last symbols to compare","Help: Number of symbols")
elseif Dlg.CurPos==4 then far.Message("Case of letters in FileName will be ignored","Help: Ignore case")
elseif Dlg.CurPos==5 then far.Message("Full duplicates of FileName will be ignored","Help: Ignore full duplicates")
elseif Dlg.CurPos==6 then far.Message("Full duplicates should be the same size","Help: Full duplicates should be the same size")
elseif Dlg.CurPos==7 then far.Message("Full duplicates should be the same attributes","Help: Full duplicates should be the same attributes")
elseif Dlg.CurPos==8 then far.Message("mcs - total time of execution in mcs\nReport will be saved to:\n"..freport,"Help: Report",nil,"l")
end
end;
}
Автор: Alexyz21
Дата сообщения: 12.05.2016 13:10
13.0 [more]
Код: local F = far.Flags
local ffi = require'ffi'
local C = ffi.C
local NULL = ffi.cast("void*",0)
local PANEL_ACTIVE = ffi.cast("HANDLE",-1)
local psInfo = ffi.cast("struct PluginStartupInfo*",far.CPluginStartupInfo())

local PanelMode,Desc1,Indi1 = 999,"Select duplicates","!?"
local guid = "FE9B8874-9651-434C-8182-72329F2371A5"
local uGuid = win.Uuid(guid)
local BS,ts = string.byte("\\"),{nil,true,9999,true,false,false,false,false}
local freport = win.GetEnv("Temp").."\\Report.txt"

ffi.cdef[[
void* malloc (size_t);
void free (void*);
int StrCmpW(const wchar_t*, const wchar_t*);
int StrCmpIW(const wchar_t*, const wchar_t*);
int wcscmp(const wchar_t*, const wchar_t*);
int _wcsicmp(const wchar_t*, const wchar_t*);
int wcsncmp(const wchar_t*, const wchar_t*, size_t);
int _wcsnicmp(const wchar_t*, const wchar_t*, size_t);
int strcmp(const char*, const char*);
int _stricmp(const char*, const char*);
int _strnicmp(const char*, const char*, size_t);
int strncmp(const char*, const char*, size_t);
char* strrchr(const char*, int);
size_t strlen(const char*);
int memcmp(const void*, const void*, size_t);
wchar_t* wmemcpy(wchar_t*, const wchar_t*, size_t);
]]

local function ToWChar(str)
str=win.Utf8ToUtf16(str)
local res=ffi.new("wchar_t[?]",#str/2+1)
ffi.copy(res,str)
return res
end

local function GetStartAndLenW(name)
local ptr = C.wcsrchr(name,BS)
name = ptr==nil and name or ptr+1
local len = tonumber(C.wcslen(name))
if ts[2] and ts[3]<0 and -ts[3]<len then
local res=ffi.new("wchar_t[?]",len+1)
ffi.copy(res,name+len+ts[3],-ts[3]*2)
ffi.copy(res-ts[3],name,(len+ts[3])*2)
return res,len
else
return name,len
end
end

local function StartAndLenW(name)
local ptr = C.wcsrchr(name,BS)
name = ptr==nil and name or ptr+1
local len = tonumber(C.wcslen(name))
if ts[2] and ts[3]<0 and -ts[3]<len then
return name+len+ts[3],-ts[3],name,len
elseif ts[2] and ts[3]>0 and ts[3]<len then
return name,ts[3],name,len
else
return name,len,name,len
end
end

local Compare = function(p1,p2,opt)
local st1,ln1 = GetStartAndLenW(p1.FileName)
local st2,ln2 = GetStartAndLenW(p2.FileName)
return ts[4] and C._wcsicmp(st1,st2) or C.wcscmp(st1,st2)
end

local function StartAndLen(name)
local ptr = C.strrchr(name,BS)
name = ptr==nil and name or ptr+1
local len = tonumber(C.strlen(name))
if ts[2] and ts[3]<0 and -ts[3]<len then
return name+len+ts[3],-ts[3],name,len
elseif ts[2] and ts[3]>0 and ts[3]<len then
return name,ts[3],name,len
else
return name,len,name,len
end
end

local Items = {
--[[01]] {F.DI_DOUBLEBOX, 3,1, 65,8, 0, 0,0, 0, "Select duplicates of FileName. Help: F1"},
--[[02]] {F.DI_CHECKBOX, 5,2, 26,2, 0, 0,0, 0, "Num&ber of symbols"},
--[[03]] {F.DI_EDIT, 27,2, 32,2, 0, 0,0, 0, ""},
--[[04]] {F.DI_CHECKBOX, 5,3, 20,3, 0, 0,0, 0, "Ignore &case"},
--[[05]] {F.DI_CHECKBOX, 38,3, 62,3, 0, 0,0, 0, "Ignore Full &Duplicates"},
--[[06]] {F.DI_CHECKBOX, 5,4, 34,4, 0, 0,0, 0, "FD should be the same &size"},
--[[07]] {F.DI_CHECKBOX, 5,5, 40,5, 0, 0,0, 0, "FD should be the same &attributes"},
--[[08]] {F.DI_CHECKBOX, 5,7, 15,7, 0, 0,0, 0, "Re&port"},
--[[09]] {F.DI_TEXT, -1,6, 0,0, 0, 0,0, F.DIF_SEPARATOR,""},
--[[10]] {F.DI_BUTTON, 0,7, 0,0, 0, 0,0, F.DIF_DEFAULTBUTTON+F.DIF_CENTERGROUP,"&Ok"},
--[[11]] {F.DI_BUTTON, 0,7, 0,0, 0, 0,0, F.DIF_CENTERGROUP,"Ca&ncel"}
}

local tts={}

local function DlgProc(hDlg,Msg,Param1,Param2)
local function Set1()
hDlg:send(F.DM_ENABLE,6,tts[5] and 1 or 0)
hDlg:send(F.DM_ENABLE,7,tts[5] and 1 or 0)
end
if Msg==F.DN_INITDIALOG then
for i=2,#Items-3 do tts[i]=ts[i] end
Set1()
hDlg:send(F.DM_SETTEXT,3,tts[3])
hDlg:send(F.DM_SETCHECK,2,tts[2] and F.BSTATE_CHECKED or F.BSTATE_UNCHECKED)
for j=4,8 do
hDlg:send(F.DM_SETCHECK,j,tts[j] and F.BSTATE_CHECKED or F.BSTATE_UNCHECKED)
end
elseif Msg==F.DN_BTNCLICK and (Param1==2 or Param1>=4 and Param1<=8) then
tts[Param1] = Param2~=0
if Param1==5 then Set1() end
elseif Msg==F.DN_EDITCHANGE and Param1==3 then -- Number symbols
tts[3] = tonumber(hDlg:send(F.DM_GETTEXT,3)) or tts[3]
else
return
end
return true
end

Macro {
description="! Select Duplicates FileName in Branch panel"; name="SDFN"; area="Shell";
action=function()
if far.Dialog(uGuid,-1,-1,69,10,nil,Items,nil,DlgProc)==#Items-1 then
local t0=far.FarClock()
for i=2,#Items-3 do ts[i]=tts[i] end
local pBL0,pBL1 = ffi.cast("BOOL*",0),ffi.cast("BOOL*",1)
local pc=ffi.cast("struct PluginStartupInfo*",far.CPluginStartupInfo()).PanelControl
--local PInfo=panel.GetPanelInfo(nil,1)
local PInfo=ffi.new("struct PanelInfo")
PInfo.StructSize=ffi.sizeof(PInfo)
if pc(PANEL_ACTIVE,"FCTL_GETPANELINFO",0,PInfo)==1 then
local pin,pif = tonumber(PInfo.ItemsNumber),tonumber(PInfo.Flags)
if pin>1 then
if bit.band(pif,F.PFLAGS_SELECTEDFIRST)>0 then Keys("ShiftF12") end
if bit.band(pif,F.PFLAGS_NUMERICSORT)>0 then pc(PANEL_ACTIVE,"FCTL_SETNUMERICSORT",0,nil) end
local pfcss=bit.band(pif,F.PFLAGS_CASESENSITIVESORT)==0
if ts[4] and not pfcss or not ts[4] and pfcss then pc(PANEL_ACTIVE,"FCTL_SETCASESENSITIVESORT",ts[4] and 0 or 1,nil) end
if bit.band(pif,F.PFLAGS_REVERSESORTORDER)==0 then pc(PANEL_ACTIVE,"FCTL_SETSORTORDER",1,nil) end
Panel.LoadCustomSortMode(PanelMode,{Description=Desc1;Indicator=Indi1;Compare=Compare})
Panel.SetCustomSortMode(PanelMode,0)
local full,tsel,fn0,fn1,fn2,fn3,st0,ln0,st1,ln1,st2,ln2,st3,ln3,sz0,sz1,fa0,fa1 = false,{},"","","","",0,0,0,0,0,0,0,0,0,0,"",""
local function Comp(stA,lnA,stB,lnB)
return ts[4] and C._wcsicmp(stA,stB) or C.wcscmp(stA,stB)
end
local function Proc(i,x)
if ts[5] and x then
if full then
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i,pBL0)
else
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-1,pBL0)
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i,pBL0)
full=true
end
else
if #tsel==0 or Comp(tsel[#tsel][2],tsel[#tsel][3],st1,ln1)~=0 then
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-1,pBL1)
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i,pBL1)
table.insert(tsel,{2,st1,ln1,win.Utf16ToUtf8(ffi.string(st1,ln1*2))})
else
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i,pBL1)
tsel[#tsel][1]=tsel[#tsel][1]+1
end
full=false
end
end
local function GetPanelItem(hnd,i)
local ppi = ffi.new("struct FarGetPluginPanelItem")
ppi.StructSize = ffi.sizeof("struct FarGetPluginPanelItem")
ppi.Size = psInfo.PanelControl(hnd,"FCTL_GETPANELITEM",i,NULL)
if ppi.Size~=0 then
local buf = ffi.new("char[?]",ppi.Size)
ppi.Item = ffi.cast("struct PluginPanelItem*",buf)
psInfo.PanelControl(hnd,"FCTL_GETPANELITEM",i,ppi)
return buf
end
return nil
end
local function PGPI(i)
local buf = GetPanelItem(PANEL_ACTIVE,i)
if buf then
local item = ffi.cast("struct PluginPanelItem*",buf)
st1,ln1,st3,ln3=StartAndLenW(item.FileName)
if ts[6] then sz1=item.FileSize end
if ts[7] then fa1=item.FileAttributes end
C.free(ffi.gc(buf,nil))
end
end
PGPI(0)
pc(PANEL_ACTIVE,"FCTL_BEGINSELECTION",0,nil)
for i=1,pin-1 do
st0,ln0,st2,ln2,sz0,fa0 = st1,ln1,st3,ln3,sz1,fa1
PGPI(i)
if ts[4] and (ts[2] and C._wcsnicmp(st1,st0,ts[3])==0 or C._wcsicmp(st1,st0)==0) then Proc(i,C._wcsicmp(st3,st2)==0 and not (ts[6] and sz1~=sz0) and not (ts[7] and fa1~=fa0))
elseif not ts[4] and (ts[2] and C.wcsncmp(st1,st0,ts[3])==0 or C.wcscmp(st1,st0)==0) then Proc(i,C.wcscmp(st3,st2)==0 and not (ts[6] and sz1~=sz0) and not (ts[7] and fa1~=fa0))
end
end
pc(PANEL_ACTIVE,"FCTL_ENDSELECTION",0,nil)
pc(PANEL_ACTIVE,"FCTL_REDRAWPANEL",0,nil)
--Keys("ShiftF12")
if ts[8] then
table.sort(tsel,function(a,b) return a[1]<b[1] end)
local h = io.open(freport,"wb")
io.close(h)
h = io.open(freport,"ab")
h:write("Items: "..#tsel..
"\nExecution time: "..(far.FarClock()-t0)..
" mcs\nNumber of symbols: "..(ts[2] and ts[3] or "all")..
"\nIgnore case: "..tostring(ts[4])..
"\nIgnore full duplicates: "..tostring(ts[5])..
"\nFull duplicates should be the same size: "..tostring(ts[6])..
"\nFull duplicates should be the same attributes: "..tostring(ts[7])..
"\n\n")
for i=#tsel,1,-1 do h:write(tsel[i][1].."\t"..tsel[i][4].."\n") table.remove(tsel) end
io.close(h)
far.Message("mcs: "..far.FarClock()-t0,"SDFN")
end
end
end
end
end;
}

Macro {
description = "SDFN - Help"; area = "Dialog"; key = "F1";
condition=function() return Area.Dialog and Dlg.Id==guid end;
action=function()
if Dlg.CurPos<=3 then far.Message("The number of first or last symbols to compare","Help: Number of symbols")
elseif Dlg.CurPos==4 then far.Message("Case of letters in FileName will be ignored","Help: Ignore case")
elseif Dlg.CurPos==5 then far.Message("Full duplicates of FileName will be ignored","Help: Ignore full duplicates")
elseif Dlg.CurPos==6 then far.Message("Full duplicates should be the same size","Help: Full duplicates should be the same size")
elseif Dlg.CurPos==7 then far.Message("Full duplicates should be the same attributes","Help: Full duplicates should be the same attributes")
elseif Dlg.CurPos==8 then far.Message("mcs - total time of execution in mcs\nReport will be saved to:\n"..freport,"Help: Report",nil,"l")
end
end;
}
Автор: Angel_Ka
Дата сообщения: 12.05.2016 16:21
Alexyz21

Цитата:
12.9

Отлично проходит микротест. На большее пока не было времени. Т.е. сделаю тесты несколько позже.

Цитата:
13.0

Рушит Фар без объяснения причин. Проверено на двух разных машинах. На обеих Win10entRu x64.

Добавлено:
shmuz2

Цитата:
Чтобы закрыть этот вопрос.

БОЛЬШОЕ СПАСИБО Вам за сделанную работу!

Цитата:
Режим сортировки панели можно задать в установках панели результатов поиска плагина LF Search. Попробуйте установить там 2,0 (сортировка по имени). Если хотите, чтобы был тот же режим сортировки, что был перед началом поиска, установите 0,0.

Большое спасибо за подсказку! На мой взгляд, это очень хорошо задумано, но пока не очень-то удобно реализовано. В хелпе плагина указано:

Цитата:
Укажите режим сортировки (0...15; 0=сортировка по умолчанию) …

А как пользователь определит какой из номеров от 1 до 15 присвоен какому режиму сортировки файлов на панели Фара? Я, например, сначала интуитивно полагал, что 1 — это "Имя», т.к. это первый режим в меню сортировки, а оказалось, что нет, это "Не сортировать". И выражение "сортировка по умолчанию" тоже без дополнительных пояснений непонятно — по умолчанию для Фара или для плагина? и где это умолчание установлено? А так как Вы мне посоветовали (и это, по-моему, вполне интуитивно), то, имхо, правильнее было бы в хелпе так и указать "0 = режим сортировки, который был перед началом поиска".

Установил в LF Search сортировку 0,0 и снова измерил время работы макроса на панелях плагинов (поскольку изменения, к сожалению, производились на другой машине, несколько менее мощной, то их результаты не сопоставимы с предыдущими замерами, и сравнимы только между собой):


Код: LF Search: временная панель: mcs: 19 686 988 mcs: 19 846 705 mcs: 18 987 141

Врем. панель (LuaFAR): mcs: 19 060 244 mcs: 18 897 740 mcs: 19 051 854
Автор: shmuz2
Дата сообщения: 12.05.2016 17:06
Angel_Ka
К сожалению, на совершенствование хелпа нет времени. Более того, в плагине есть фичи (например, Grep), которые в хелпе вообще отсутствуют.
Автор: Angel_Ka
Дата сообщения: 12.05.2016 17:10
Сделал контрольный замер:

Код: LF Search: временная панель: mcs: 13 583 989

Врем. панель (LuaFAR): mcs: 13 707 851
Автор: Alexyz21
Дата сообщения: 12.05.2016 20:03
12.9.1 [more]
Код: -- 12.9.1
local F = far.Flags
local ffi = require'ffi'
local C = ffi.C

local PanelMode,Desc1,Indi1 = 999,"Select duplicates","!?"
local guid = "FE9B8874-9651-434C-8182-72329F2371A5"
local uGuid = win.Uuid(guid)
local BS,ts = string.byte("\\"),{nil,true,9999,true,false,false,false,false}
local freport = win.GetEnv("Temp").."\\Report.txt"

ffi.cdef[[
int wcscmp(const wchar_t*, const wchar_t*);
int _wcsicmp(const wchar_t*, const wchar_t*);
int wcsncmp(const wchar_t*, const wchar_t*, size_t);
int _wcsnicmp(const wchar_t*, const wchar_t*, size_t);
]]

local function ToWChar(str)
str=win.Utf8ToUtf16(str)
local res=ffi.new("wchar_t[?]",#str/2+1)
ffi.copy(res,str)
return res
end

local function GetStartAndLenW(name)
local ptr = C.wcsrchr(name,BS)
name = ptr==nil and name or ptr+1
local len = tonumber(C.wcslen(name))
if ts[2] and ts[3]<0 and -ts[3]<len then
local res=ffi.new("wchar_t[?]",len+1)
ffi.copy(res,name+len+ts[3],-ts[3]*2)
ffi.copy(res-ts[3],name,(len+ts[3])*2)
return res,len
else
return name,len
end
end

local function StartAndLenW(name)
local ptr = C.wcsrchr(name,BS)
name = ptr==nil and name or ptr+1
local len = tonumber(C.wcslen(name))
if ts[2] and ts[3]<0 and -ts[3]<len then
return name+len+ts[3],-ts[3],name,len
elseif ts[2] and ts[3]>0 and ts[3]<len then
return name,ts[3],name,len
else
return name,len,name,len
end
end

local Compare = function(p1,p2,opt)
local st1,ln1 = GetStartAndLenW(p1.FileName)
local st2,ln2 = GetStartAndLenW(p2.FileName)
return ts[4] and C._wcsicmp(st1,st2) or C.wcscmp(st1,st2)
end

local Items = {
--[[01]] {F.DI_DOUBLEBOX, 3,1, 65,8, 0, 0,0, 0, "Select duplicates of FileName. Help: F1"},
--[[02]] {F.DI_CHECKBOX, 5,2, 26,2, 0, 0,0, 0, "Num&ber of symbols"},
--[[03]] {F.DI_EDIT, 27,2, 32,2, 0, 0,0, 0, ""},
--[[04]] {F.DI_CHECKBOX, 5,3, 20,3, 0, 0,0, 0, "Ignore &case"},
--[[05]] {F.DI_CHECKBOX, 38,3, 62,3, 0, 0,0, 0, "Ignore Full &Duplicates"},
--[[06]] {F.DI_CHECKBOX, 5,4, 34,4, 0, 0,0, 0, "FD should be the same &size"},
--[[07]] {F.DI_CHECKBOX, 5,5, 40,5, 0, 0,0, 0, "FD should be the same &attributes"},
--[[08]] {F.DI_CHECKBOX, 5,7, 15,7, 0, 0,0, 0, "Re&port"},
--[[09]] {F.DI_TEXT, -1,6, 0,0, 0, 0,0, F.DIF_SEPARATOR,""},
--[[10]] {F.DI_BUTTON, 0,7, 0,0, 0, 0,0, F.DIF_DEFAULTBUTTON+F.DIF_CENTERGROUP,"&Ok"},
--[[11]] {F.DI_BUTTON, 0,7, 0,0, 0, 0,0, F.DIF_CENTERGROUP,"Ca&ncel"}
}

local tts={}

local function DlgProc(hDlg,Msg,Param1,Param2)
local function Set1()
hDlg:send(F.DM_ENABLE,6,tts[5] and 1 or 0)
hDlg:send(F.DM_ENABLE,7,tts[5] and 1 or 0)
end
if Msg==F.DN_INITDIALOG then
for i=2,#Items-3 do tts[i]=ts[i] end
Set1()
hDlg:send(F.DM_SETTEXT,3,tts[3])
hDlg:send(F.DM_SETCHECK,2,tts[2] and F.BSTATE_CHECKED or F.BSTATE_UNCHECKED)
for j=4,8 do
hDlg:send(F.DM_SETCHECK,j,tts[j] and F.BSTATE_CHECKED or F.BSTATE_UNCHECKED)
end
elseif Msg==F.DN_BTNCLICK and (Param1==2 or Param1>=4 and Param1<=8) then
tts[Param1] = Param2~=0
if Param1==5 then Set1() end
elseif Msg==F.DN_EDITCHANGE and Param1==3 then -- Number symbols
tts[3] = tonumber(hDlg:send(F.DM_GETTEXT,3)) or tts[3]
else
return
end
return true
end

Macro {
description="* Select Duplicates FileName in Branch panel"; name="SDFN"; area="Shell";
action=function()
if far.Dialog(uGuid,-1,-1,69,10,nil,Items,nil,DlgProc)==#Items-1 then
local t0=far.FarClock()
for i=2,#Items-3 do ts[i]=tts[i] end
local pBL0,pBL1 = ffi.cast("BOOL*",0),ffi.cast("BOOL*",1)
--local PInfo=panel.GetPanelInfo(nil,1)
local PInfo=ffi.new("struct PanelInfo")
PInfo.StructSize=ffi.sizeof(PInfo)
local pc=ffi.cast("struct PluginStartupInfo*",far.CPluginStartupInfo()).PanelControl
if pc(PANEL_ACTIVE,"FCTL_GETPANELINFO",0,PInfo)==1 then
local pin,pif = tonumber(PInfo.ItemsNumber),tonumber(PInfo.Flags)
if pin>1 then
if bit.band(pif,F.PFLAGS_SELECTEDFIRST)>0 then Keys("ShiftF12") end
if bit.band(pif,F.PFLAGS_NUMERICSORT)>0 then pc(PANEL_ACTIVE,"FCTL_SETNUMERICSORT",0,nil) end
local pfcss=bit.band(pif,F.PFLAGS_CASESENSITIVESORT)==0
if ts[4] and not pfcss or not ts[4] and pfcss then pc(PANEL_ACTIVE,"FCTL_SETCASESENSITIVESORT",ts[4] and 0 or 1,nil) end
if bit.band(pif,F.PFLAGS_REVERSESORTORDER)==0 then pc(PANEL_ACTIVE,"FCTL_SETSORTORDER",1,nil) end
Panel.LoadCustomSortMode(PanelMode,{Description=Desc1;Indicator=Indi1;Compare=Compare})
Panel.SetCustomSortMode(PanelMode,0)
local full,tsel,st0,ln0,st1,ln1,st2,ln2,st3,ln3,sz0,sz1,fa0,fa1 = false,{}
local function Comp(stA,lnA,stB,lnB) return ts[4] and C._wcsicmp(stA,stB) or C.wcscmp(stA,stB) end
local function Proc(i,x)
if ts[5] and x then
if full then
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-1,pBL0)
else
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-2,pBL0)
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-1,pBL0)
full=true
end
else
if #tsel==0 or Comp(tsel[#tsel][2],tsel[#tsel][3],st1,ln1)~=0 then
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-2,pBL1)
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-1,pBL1)
table.insert(tsel,{2,st1,ln1,win.Utf16ToUtf8(ffi.string(st1,ln1*2))})
else
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-1,pBL1)
tsel[#tsel][1]=tsel[#tsel][1]+1
end
full=false
end
end
local function PGPI(i)
st1,ln1,st3,ln3=StartAndLenW(ToWChar(panel.GetPanelItem(nil,1,i).FileName))
if ts[6] then sz1=panel.GetPanelItem(nil,1,i).FileSize end
if ts[7] then fa1=panel.GetPanelItem(nil,1,i).FileAttributes end
end
PGPI(1)
pc(PANEL_ACTIVE,"FCTL_BEGINSELECTION",0,nil)
for i=2,pin do
st0,ln0,st2,ln2,sz0,fa0 = st1,ln1,st3,ln3,sz1,fa1
PGPI(i)
if ts[4] and (ts[2] and C._wcsnicmp(st1,st0,ts[3])==0 or C._wcsicmp(st1,st0)==0) then Proc(i,C._wcsicmp(st3,st2)==0 and not (ts[6] and sz1~=sz0) and not (ts[7] and fa1~=fa0))
elseif not ts[4] and (ts[2] and C.wcsncmp(st1,st0,ts[3])==0 or C.wcscmp(st1,st0)==0) then Proc(i,C.wcscmp(st3,st2)==0 and not (ts[6] and sz1~=sz0) and not (ts[7] and fa1~=fa0))
end
end
pc(PANEL_ACTIVE,"FCTL_ENDSELECTION",0,nil)
pc(PANEL_ACTIVE,"FCTL_REDRAWPANEL",0,nil)
--Keys("ShiftF12")
if ts[8] then
table.sort(tsel,function(a,b) return a[1]<b[1] end)
local h = io.open(freport,"wb")
io.close(h)
h = io.open(freport,"ab")
h:write("Items: "..#tsel..
"\nExecution time: "..(far.FarClock()-t0)..
" mcs\nNumber of symbols: "..(ts[2] and ts[3] or "all")..
"\nIgnore case: "..tostring(ts[4])..
"\nIgnore Full Duplicates: "..tostring(ts[5])..
(ts[5] and ("\nFD should be the same size: "..tostring(ts[6])) or "")..
(ts[5] and ("\nFD should be the same attributes: "..tostring(ts[7])) or "")..
"\n\n")
for i=#tsel,1,-1 do h:write(tsel[i][1].."\t"..tsel[i][4].."\n") table.remove(tsel) end
io.close(h)
far.Message("mcs: "..far.FarClock()-t0,"SDFN")
end
end
end
end
end;
}

Macro {
description = "SDFN - Help"; area = "Dialog"; key = "F1";
condition=function() return Area.Dialog and Dlg.Id==guid end;
action=function()
if Dlg.CurPos<=3 then far.Message("The number of first or last symbols to compare","Help: Number of symbols")
elseif Dlg.CurPos==4 then far.Message("Case of letters in FileName will be ignored","Help: Ignore case")
elseif Dlg.CurPos==5 then far.Message("Full duplicates of FileName will be ignored","Help: Ignore Full Duplicates")
elseif Dlg.CurPos==6 then far.Message("Full duplicates should be the same size","Help: FD should be the same size")
elseif Dlg.CurPos==7 then far.Message("Full duplicates should be the same attributes","Help: FD should be the same attributes")
elseif Dlg.CurPos==8 then far.Message("mcs - total time of execution in mcs\nReport will be saved to:\n"..freport,"Help: Report",nil,"l")
end
end;
}
Автор: Angel_Ka
Дата сообщения: 12.05.2016 20:58

Цитата:
12.9.1

тесты проходить готова

Цитата:
13.0.1

[more=падает]
Код: Exception in [W:\FarLce\plugins\luamacro\luamacro.dll] plugin.
==============================================================
System information:
Windows NT, version 10.0.10240
==============================================================
FAR.EXE information:
Version info: 3.0.4670
File size: 4359168 bytes
Time stamp: 12.05.2016 04:04:04
Hdr checksum: 0x0043078E (computed: 0x0043078E)
==============================================================
Exception C0000005 "ACCESS_VIOLATION" at 776ACDE5 has 0001007F flags.
EBP: 00D2EFA8 EIP: 776ACDE5 ESP: 00D2EEA8 CS: 00000023 SS: 0000002B Flags: 00210246
EDI: 00E00000 ESI: 08CC5AC8 EBX: 08CBDBC8 EDX: 075EFAF0 ECX: FFFFFFFF EAX: 08CC5AD0
GS: 0000002B FS: 00000053 ES: 0000002B DS: 0000002B
Cw: 0000027F Sw: 00000020 Tw: 0000FFFF EOf: 66D81282 Es: 00000000 DOf: 07193440 Ds: 00000000 Cr0: 00000000
dr0: 00000000 dr1: 00000000 dr2: 00000000 dr3: 00000000 dr6: 00000000 dr7: 00000000
==============================================================
Addr[ 1]: 776ACDE5 Mod:77670000 lMod:77670000 "ntdll.dll"+0003C1E5 at ".text"+0003BDE5
Addr[ 2]: 776EC570 Mod:77670000 lMod:77670000 "ntdll.dll"+0007B970 at ".text"+0007B570
Addr[ 3]: 776AC6DC Mod:77670000 lMod:77670000 "ntdll.dll"+0003BADC at ".text"+0003B6DC
Addr[ 4]: 75047765 Mod:75000000 lMod:75000000 "msvcrt.dll"+00046B65 at ".text"+00046765
Addr[ 5]: 66D84873 Mod:66D80000 lMod:66D80000 "lua51.dll"+00003C73 at ".text"+00003873
Addr[ 6]: 66DBA583 Mod:66D80000 lMod:66D80000 "lua51.dll"+00039983 at ".text"+00039583: "lua_dump" + 00023733
Addr[ 7]: 66DBC2CB Mod:66D80000 lMod:66D80000 "lua51.dll"+0003B6CB at ".text"+0003B2CB: "lua_dump" + 0002547B

Stack details:
Addr[ 1]: 776ACDE5 Mod:77670000 lMod:77670000 "ntdll.dll"+0003C1E5 at ".text"+0003BDE5
Stack: 08CBDBC8 08CBDBD0 07193440 08CBDBD0 00D2F0AC 01339450 08CBDBD0 75047700 00000000 00000000

Addr[ 2]: 776EC570 Mod:77670000 lMod:77670000 "ntdll.dll"+0007B970 at ".text"+0007B570
Stack: 00000000 00D2F034 75047765 00E00000 00000000 08CBDBD0 56766480 07193440 0000C130 00D2F0AC

Addr[ 3]: 776AC6DC Mod:77670000 lMod:77670000 "ntdll.dll"+0003BADC at ".text"+0003B6DC
Stack: 00E00000 00000000 08CBDBD0 56766480 07193440 0000C130 00D2F0AC 00000B34 00000001 00D2F0D4

Addr[ 4]: 75047765 Mod:75000000 lMod:75000000 "msvcrt.dll"+00046B65 at ".text"+00046765
Stack: 08CBDBD0 06159BF8 00D2F0D4 66DBA583 06159BF8 06288598 00D2F0D4 07193438 00000100 76FBB52D

Addr[ 5]: 66D84873 Mod:66D80000 lMod:66D80000 "lua51.dll"+00003C73 at ".text"+00003873
Stack:
1) 06159BF8 = 88 84 28 06 57 0C 00 00 00 10 00 00 90 30 19 07 ѕё(.W.......љ0..
2) 06288598 = 01 00 02 20 04 00 00 00 00 00 0F 00 00 00 00 00 ... ............
3) 00D2F0D4 = D0 DB CB 08 CB C2 DB 66 90 30 19 07 18 F1 D2 00 л&#9608;&#9574;.&#9574;&#9516;&#9608;fљ0...ым.
4) 07193438 = C8 DB CB 08 F5 FF FF FF 00 00 00 00 FF FF FF FF &#9562;&#9608;&#9574;.ш...........
5) 00000100 = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
6) 76FBB52D = 85 C0 78 47 85 DB 0F 84 AC 04 03 00 8A C3 24 03 Ё&#9492;xGЁ&#9608;.ёг...і&#9500;$.
7) 75000000 = 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 MZљ.............
8) 00D2F084 = F8 9B 15 06 00 00 00 00 40 34 19 07 B8 45 29 06 ЭЏ......@4..ИE).
9) 00000000 = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
10) 00D2F08C = 40 34 19 07 B8 45 29 06 00 00 00 00 00 00 00 00 @4..ИE).........
-66D84833 B7 49 mov bh, 49h
-66D84835 06 push es
-66D84836 89 4C 24 30 mov [esp+30h], ecx
-66D8483A 83 C4 1C add esp, 1Ch ;28 "...."
-66D8483D 5B pop ebx
-66D8483E 5E pop esi
-66D8483F 5F pop edi
-66D84840 5D pop ebp
-66D84841 59 pop ecx
-66D84842 03 24 24 add esp, [esp]
-66D84845 83 C4 10 add esp, 10h ;16 "...."
-66D84848 51 push ecx
-66D84849 C3 ret
-66D8484A 55 push ebp
-66D8484B 89 E5 mov ebp, esp
-66D8484D 53 push ebx
-66D8484E 89 CB mov ebx, ecx
-66D84850 2B 63 04 sub esp, [ebx+4]
-66D84853 89 63 04 mov [ebx+4], esp
-66D84856 0F B6 4B 08 movzx ecx, [ebx+8]
-66D8485A 83 E9 01 sub ecx, 1 ;1 "...."
-66D8485D 78 0C js +0Eh ;66D8486B
-66D8485F 8B 44 8B 28 mov eax, [ebx+ecx*4+28h]
-66D84863 89 04 8C mov [esp+ecx*4], eax
-66D84866 83 E9 01 sub ecx, 1 ;1 "...."
-66D84869 79 F4 jns -0Ah ;66D8485F
-66D8486B 8B 4B 20 mov ecx, [ebx+20h]
-66D8486E 8B 53 24 mov edx, [ebx+24h]
-66D84871 FF 13 call dword ptr [ebx]
>66D84873 89 43 20 mov [ebx+20h], eax
+66D84876 89 53 24 mov [ebx+24h], edx
+66D84879 80 7B 0A 01 cmp byte ptr [ebx+0Ah], 1 ;1 "...."
+66D8487D 72 0A jc +0Ch ;66D84889
+66D8487F 74 05 je +7 ;66D84886
+66D84881 DD 5B esc 5, 5Bh
+66D84883 10 EB adc bl, ch
+66D84885 03 D9 add ebx, ecx
+66D84887 5B pop ebx
+66D84888 10 29 adc [ecx], ch
+66D8488A 63 04 8B arpl [ebx+ecx*4], ax
+66D8488D 5D pop ebp
+66D8488E FC cld
+66D8488F C9 leave
+66D84890 C3 ret
+66D84891 db 00h dup (15)
+66D848A0 55 push ebp
+66D848A1 89 C5 mov ebp, eax
+66D848A3 57 push edi
+66D848A4 89 D7 mov edi, edx
+66D848A6 56 push esi
+66D848A7 89 CE mov esi, ecx
+66D848A9 53 push ebx
+66D848AA 83 EC 1C sub esp, 1Ch ;28 "...."
+66D848AD 0F B6 40 1C movzx eax, [eax+1Ch]

Addr[ 6]: 66DBA583 Mod:66D80000 lMod:66D80000 "lua51.dll"+00039983 at ".text"+00039583: "lua_dump" + 00023733
Stack:
1) 07193090 = 00 30 19 07 02 06 01 00 F0 01 15 06 00 00 00 00 .0......-.......
2) 00D2F118 = B8 45 29 06 F8 9B 15 06 48 91 28 06 CC 00 00 00 ИE).ЭЏ..HЉ(.&#9568;...
3) 0615B6A8 = 00 00 00 00 22 04 00 00 C3 EB 77 99 04 00 00 00 ...."...&#9500;вwЎ....
4) 00001840 = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
5) 06159BF8 = 88 84 28 06 57 0C 00 00 00 10 00 00 90 30 19 07 ѕё(.W.......љ0..
6) 0615B6B8 = 66 72 65 65 00 00 00 00 00 00 00 00 23 00 00 00 free........#...
7) 00000C13 = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
8) 00000001 = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
9) 00000002 = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
10) 061C0C08 = 00 00 00 00 22 04 00 06 59 8E 39 E5 08 00 00 00 ...."...Yј9т....
-66DBA543 F2 repne
-66DBA544 83 FE 01 cmp esi, 1 ;1 "...."
-66DBA547 88 54 24 68 mov [esp+68h], dl
-66DBA54B C7 44 24 64 04 00 00 00 mov dword ptr [esp+64h], 4
-66DBA553 76 11 jbe +13h ;66DBA566 lua51.dll::lua_dump+23716h
-66DBA555 8D 04 B5 0B 00 00 00 lea eax, [0Bh+esi*4]
-66DBA55C 83 E0 F0 and eax, -10h ;-16 "...."
-66DBA55F 83 C0 04 add eax, 4 ;4 "...."
-66DBA562 89 44 24 64 mov [esp+64h], eax
-66DBA566 8B 5C 24 38 mov ebx, [esp+38h]
-66DBA56A 8D 4C 24 60 lea ecx, [esp+60h]
-66DBA56E 8B 74 24 44 mov esi, [esp+44h]
-66DBA572 C7 83 94 00 00 00 FF FF FF FFmov dword ptr [ebx+94h], -1
-66DBA57C 2B 33 sub esi, [ebx]
-66DBA57E E8 C7 A2 FC FF call 66D8484Ah ;-35D34h
>66DBA583 83 BB 94 00 00 00 FF cmp dword ptr [ebx+94h], -1 ;-1 "...."
+66DBA58A 74 35 je +37h ;66DBA5C1 lua51.dll::lua_dump+23771h
+66DBA58C 8B 44 24 60 mov eax, [esp+60h]
+66DBA590 C7 44 24 5C FC FF FF FF mov dword ptr [esp+5Ch], -4
+66DBA598 89 44 24 58 mov [esp+58h], eax
+66DBA59C 8D 44 24 58 lea eax, [esp+58h]
+66DBA5A0 89 44 24 08 mov [esp+8], eax
+66DBA5A4 8B 43 18 mov eax, [ebx+18h]
+66DBA5A7 8B 9C 24 30 01 00 00 mov ebx, [esp+130h]
+66DBA5AE 89 44 24 04 mov [esp+4], eax
+66DBA5B2 89 1C 24 mov [esp], ebx
+66DBA5B5 E8 86 D1 FC FF call 66D87740h ;-32E75h lua51.dll::luaL_error+10A0h
+66DBA5BA C7 40 04 FD FF FF FF mov dword ptr [eax+4], -3

Addr[ 7]: 66DBC2CB Mod:66D80000 lMod:66D80000 "lua51.dll"+0003B6CB at ".text"+0003B2CB: "lua_dump" + 0002547B
-66DBC28B 0F 84 82 00 00 00 jz +88h ;66DBC313 lua51.dll::lua_dump+254C3h
-66DBC291 8B 4C 24 14 mov ecx, [esp+14h]
-66DBC295 89 04 24 mov [esp], eax
-66DBC298 89 4C 24 04 mov [esp+4], ecx
-66DBC29C E8 A7 3C 01 00 call 66DCFF48h ;+13CACh lua51.dll::luaL_openlibs+0FB8h
-66DBC2A1 57 push edi
-66DBC2A2 57 push edi
-66DBC2A3 89 C7 mov edi, eax
-66DBC2A5 85 FF test edi, edi
-66DBC2A7 0F 84 89 00 00 00 jz +8Fh ;66DBC336 lua51.dll::lua_dump+254E6h
-66DBC2AD 8B 44 24 20 mov eax, [esp+20h]
-66DBC2B1 89 04 24 mov [esp], eax
-66DBC2B4 E8 9F 3C 01 00 call 66DCFF58h ;+13CA4h lua51.dll::luaL_openlibs+0FC8h
-66DBC2B9 53 push ebx
-66DBC2BA 8B 54 24 10 mov edx, [esp+10h]
-66DBC2BE 8B 4A 0C mov ecx, [edx+0Ch]
-66DBC2C1 BA 0C 00 00 00 mov edx, 0Ch
-66DBC2C6 E8 E5 98 FC FF call 66D85BB0h ;-36716h
>66DBC2CB 0F B7 4C 24 18 movzx ecx, [esp+18h]
+66DBC2D0 C6 40 05 0A mov byte ptr [eax+5], 0Ah
+66DBC2D4 66 89 48 06 mov [eax+6], cx
+66DBC2D8 89 78 08 mov [eax+8], edi
+66DBC2DB 89 45 00 mov [ebp+0], eax
+66DBC2DE C7 45 04 F5 FF FF FF mov dword ptr [ebp+4], -0Bh
+66DBC2E5 E9 00 FF FF FF jmp 66DBC1EAh ;-0FBh lua51.dll::lua_dump+2539Ah
+66DBC2EA 8B 4C 24 10 mov ecx, [esp+10h]
+66DBC2EE 25 FF FF 00 00 and eax, 0FFFFh ;65535 "...."
+66DBC2F3 C1 E0 04 shl eax, 4
+66DBC2F6 03 01 add eax, [ecx]
+66DBC2F8 8B 00 mov eax, [eax]
+66DBC2FA A9 00 00 80 00 test eax, 800000h ;8388608 "..ђ."
+66DBC2FF 74 07 je +9 ;66DBC308 lua51.dll::lua_dump+254B8h
+66DBC301 8B 42 04 mov eax, [edx+4]
+66DBC304 85 C0 test eax, eax
+66DBC306 78 18 js +1Ah ;66DBC320 lua51.dll::lua_dump+254D0h
+66DBC308 DB 42 esc 3, 42h

Автор: shmuz2
Дата сообщения: 12.05.2016 21:14
Angel_Ka
У меня, когда ру-борд "бузит" помогало полностью выйти из браузера (то-есть завершить программу) и зайти снова.
Автор: Angel_Ka
Дата сообщения: 12.05.2016 21:18
shmuz2
Мусор периодически удаляю. Вход и выход из браузера попробую — спасибо за совет. Вроде бы помогает отправка писем.
Автор: Alexyz21
Дата сообщения: 12.05.2016 21:25
Angel_Ka
XPSP2x86, FAR3.0.4670, SDFN 13.0.1 всё работает. Предполагаю, что под x64 ему не нравится:

Код: st1,ln1,st3,ln3=StartAndLenW(item.FileName)
if ts[6] then sz1=item.FileSize end
if ts[7] then fa1=item.FileAttributes end
C.free(ffi.gc(buf,nil))
Автор: Angel_Ka
Дата сообщения: 12.05.2016 21:30
Alexyz21

Цитата:
сравните ... не только по производительности, но и по потреблению памяти

Подскажите, пожалуйста, чем лучше замерять память, а то я чисто индикативно ориентируюсь по System Explprer, а он особой активности системы в потреблении памяти во время тестов макроса не показывал.
Автор: Alexyz21
Дата сообщения: 12.05.2016 21:38
Я пользуюсь Process Hacker, имхо он наиболее удобен для подобных целей. В нём колонка Private bytes. Здесь на руборде есть по нему тема и Виктор там завсегдатай, он и сборки его делает.
Автор: Angel_Ka
Дата сообщения: 12.05.2016 21:39
Alexyz21
К сожалению, у нас XP уже совсем нет. На Win7 и то очередь чуть ли не по талончикам.

Ну а от кода Вашего я уже так давно отстал, что и читать большинство его строк уже не понимаю. Лишь отдельные редкие кусочки. Наверное надо на основной ветке об этом спросить. Может спецы и подскажут.


Добавлено:

Цитата:
Process Hacker

Большое спасибо, посмотрю.
Автор: Alexyz21
Дата сообщения: 12.05.2016 21:44
Angel_Ka
крэшится при любых опциях? Если снять все птички и исполнить - крэшится?
Автор: Angel_Ka
Дата сообщения: 12.05.2016 21:44

Цитата:
st1,ln1,st3,ln3=StartAndLenW(item.FileName)
if ts[6] then sz1=item.FileSize end
if ts[7] then fa1=item.FileAttributes end
C.free(ffi.gc(buf,nil))

А если временно убрать пока эти функции? Они ведь по сути "не профильные". А потом может кто подскажет.

Добавлено:

Цитата:
Если снять все птички и исполнить - крэшится?
Да, и перепробовал уже едва ли не все комбинации птичек.
Автор: Alexyz21
Дата сообщения: 12.05.2016 21:46
короче не судьба. Прибавка в скорости не такая уж и большая получилась - 2-20%, в зависимости от настроек диалога. Гораздо больше тратится времени на бестолковую пересортировку панели, потом посмотрю, что с этим можно сделать.
Автор: Angel_Ka
Дата сообщения: 12.05.2016 21:57
Alexyz21

Цитата:
заремте -- все 4 строки, перезагрузите far и посмотрите - падает при исполнении макроса?

Не падает, но и ни чего не помечает.

Добавлено:
А может быть сделаете в одном диалоге 2 независимых макроса? Работает либо один, либо другой, по выбору пользователя. Один макрос — выделяльщик дубликатов по именам, другой — по весу и атрибутам? Нашли схожие по физическим параметрам, скинули в файл-список, и потом обрабатываем бранч уже на его основе, не задевая остальные файлы. Как то вот так, на Ваше, разумеется, усмотрение, просто по интуиции.
Автор: Alexyz21
Дата сообщения: 13.05.2016 00:17
13.0.2 [more]
Код: -- 13.0.2
local F = far.Flags
local ffi = require'ffi'
local C = ffi.C
local NULL = ffi.cast("void*",0)
local PANEL_ACTIVE = ffi.cast("HANDLE",-1)

local PanelMode,Desc1,Indi1 = 999,"Select duplicates","!?"
local guid = "FE9B8874-9651-434C-8182-72329F2371A5"
local uGuid = win.Uuid(guid)
local BS,ts = string.byte("\\"),{nil,true,9999,true,false,false,false,false}
local freport = win.GetEnv("Temp").."\\Report.txt"

ffi.cdef[[
void free (void*);
int wcscmp(const wchar_t*, const wchar_t*);
int _wcsicmp(const wchar_t*, const wchar_t*);
int wcsncmp(const wchar_t*, const wchar_t*, size_t);
int _wcsnicmp(const wchar_t*, const wchar_t*, size_t);
]]

local function ToWChar(str)
str=win.Utf8ToUtf16(str)
local res=ffi.new("wchar_t[?]",#str/2+1)
ffi.copy(res,str)
return res
end

local function GetStartAndLenW(name)
local ptr = C.wcsrchr(name,BS)
name = ptr==nil and name or ptr+1
local len = tonumber(C.wcslen(name))
if ts[2] and ts[3]<0 and -ts[3]<len then
local res=ffi.new("wchar_t[?]",len+1)
ffi.copy(res,name+len+ts[3],-ts[3]*2)
ffi.copy(res-ts[3],name,(len+ts[3])*2)
return res,len
else
return name,len
end
end

local function StartAndLenW(name)
local ptr = C.wcsrchr(name,BS)
name = ptr==nil and name or ptr+1
local len = tonumber(C.wcslen(name))
if ts[2] and ts[3]<0 and -ts[3]<len then
return name+len+ts[3],-ts[3],name,len
elseif ts[2] and ts[3]>0 and ts[3]<len then
return name,ts[3],name,len
else
return name,len,name,len
end
end

local Compare = function(p1,p2)
local st1,ln1 = GetStartAndLenW(p1.FileName)
local st2,ln2 = GetStartAndLenW(p2.FileName)
return ts[4] and C._wcsicmp(st1,st2) or C.wcscmp(st1,st2)
end

local Items = {
--[[01]] {F.DI_DOUBLEBOX, 3,1, 65,8, 0, 0,0, 0, "Select duplicates of FileName. Help: F1"},
--[[02]] {F.DI_CHECKBOX, 5,2, 26,2, 0, 0,0, 0, "Num&ber of symbols"},
--[[03]] {F.DI_EDIT, 27,2, 32,2, 0, 0,0, 0, ""},
--[[04]] {F.DI_CHECKBOX, 5,3, 20,3, 0, 0,0, 0, "Ignore &case"},
--[[05]] {F.DI_CHECKBOX, 38,3, 62,3, 0, 0,0, 0, "Ignore Full &Duplicates"},
--[[06]] {F.DI_CHECKBOX, 5,4, 34,4, 0, 0,0, 0, "FD should be the same &size"},
--[[07]] {F.DI_CHECKBOX, 5,5, 40,5, 0, 0,0, 0, "FD should be the same &attributes"},
--[[08]] {F.DI_CHECKBOX, 5,7, 15,7, 0, 0,0, 0, "Re&port"},
--[[09]] {F.DI_TEXT, -1,6, 0,0, 0, 0,0, F.DIF_SEPARATOR,""},
--[[10]] {F.DI_BUTTON, 0,7, 0,0, 0, 0,0, F.DIF_DEFAULTBUTTON+F.DIF_CENTERGROUP,"&Ok"},
--[[11]] {F.DI_BUTTON, 0,7, 0,0, 0, 0,0, F.DIF_CENTERGROUP,"Ca&ncel"}
}

local tts={}

local function DlgProc(hDlg,Msg,Param1,Param2)
local function Set1()
hDlg:send(F.DM_ENABLE,6,tts[5] and 1 or 0)
hDlg:send(F.DM_ENABLE,7,tts[5] and 1 or 0)
end
if Msg==F.DN_INITDIALOG then
for i=2,#Items-3 do tts[i]=ts[i] end
Set1()
hDlg:send(F.DM_SETTEXT,3,tts[3])
hDlg:send(F.DM_SETCHECK,2,tts[2] and F.BSTATE_CHECKED or F.BSTATE_UNCHECKED)
for j=4,8 do
hDlg:send(F.DM_SETCHECK,j,tts[j] and F.BSTATE_CHECKED or F.BSTATE_UNCHECKED)
end
elseif Msg==F.DN_BTNCLICK and (Param1==2 or Param1>=4 and Param1<=8) then
tts[Param1] = Param2~=0
if Param1==5 then Set1() end
elseif Msg==F.DN_EDITCHANGE and Param1==3 then -- Number symbols
tts[3] = tonumber(hDlg:send(F.DM_GETTEXT,3)) or tts[3]
else
return
end
return true
end

Macro {
description="! Select Duplicates FileName in Branch panel"; name="SDFN"; area="Shell";
action=function()
if far.Dialog(uGuid,-1,-1,69,10,nil,Items,nil,DlgProc)==#Items-1 then
local t0=far.FarClock()
for i=2,#Items-3 do ts[i]=tts[i] end
local pBL0,pBL1 = ffi.cast("BOOL*",0),ffi.cast("BOOL*",1)
--local PInfo=panel.GetPanelInfo(nil,1)
local PInfo=ffi.new("struct PanelInfo")
PInfo.StructSize=ffi.sizeof(PInfo)
local pc=ffi.cast("struct PluginStartupInfo*",far.CPluginStartupInfo()).PanelControl
if pc(PANEL_ACTIVE,"FCTL_GETPANELINFO",0,PInfo)==1 then
local pin,pif = tonumber(PInfo.ItemsNumber),tonumber(PInfo.Flags)
if pin>1 then
if bit.band(pif,F.PFLAGS_SELECTEDFIRST)>0 then Keys("ShiftF12") end
if bit.band(pif,F.PFLAGS_NUMERICSORT)>0 then pc(PANEL_ACTIVE,"FCTL_SETNUMERICSORT",0,nil) end
local pfcss=bit.band(pif,F.PFLAGS_CASESENSITIVESORT)==0
if ts[4] and not pfcss or not ts[4] and pfcss then pc(PANEL_ACTIVE,"FCTL_SETCASESENSITIVESORT",ts[4] and 0 or 1,nil) end
if bit.band(pif,F.PFLAGS_REVERSESORTORDER)==0 then pc(PANEL_ACTIVE,"FCTL_SETSORTORDER",1,nil) end
Panel.LoadCustomSortMode(PanelMode,{Description=Desc1;Indicator=Indi1;Compare=Compare})
Panel.SetCustomSortMode(PanelMode,0)
local full,tsel,st0,ln0,st1,ln1,st2,ln2,st3,ln3,sz0,sz1,fa0,fa1 = false,{}
local function Comp(stA,lnA,stB,lnB) return ts[4] and C._wcsicmp(stA,stB) or C.wcscmp(stA,stB) end
local function Proc(i,x)
if ts[5] and x then
if full then
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i,pBL0)
else
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-1,pBL0)
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i,pBL0)
full=true
end
else
if #tsel==0 or Comp(tsel[#tsel][2],tsel[#tsel][3],st1,ln1)~=0 then
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-1,pBL1)
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i,pBL1)
table.insert(tsel,{2,st1,ln1,win.Utf16ToUtf8(ffi.string(st1,ln1*2))})
else
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i,pBL1)
tsel[#tsel][1]=tsel[#tsel][1]+1
end
full=false
end
end
local function PGPI(i)
local ppi = ffi.new("struct FarGetPluginPanelItem")
ppi.StructSize = ffi.sizeof("struct FarGetPluginPanelItem")
ppi.Size = pc(PANEL_ACTIVE,"FCTL_GETPANELITEM",i,NULL)
if ppi.Size~=0 then
local buf = ffi.new("char[?]",ppi.Size)
ppi.Item = ffi.cast("struct PluginPanelItem*",buf)
pc(PANEL_ACTIVE,"FCTL_GETPANELITEM",i,ppi)
st1,ln1,st3,ln3=StartAndLenW(ffi.cast("const unsigned short*",ppi.Item.FileName))
if ts[6] then sz1=tonumber(ppi.Item.FileSize) end
if ts[7] then fa1=tonumber(ppi.Item.FileAttributes) end
C.free(ffi.gc(buf,nil))
end
end
PGPI(0)
pc(PANEL_ACTIVE,"FCTL_BEGINSELECTION",0,nil)
for i=1,pin-1 do
st0,ln0,st2,ln2,sz0,fa0 = st1,ln1,st3,ln3,sz1,fa1
PGPI(i)
if ts[4] and (ts[2] and C._wcsnicmp(st1,st0,ts[3])==0 or C._wcsicmp(st1,st0)==0) then Proc(i,C._wcsicmp(st3,st2)==0 and not (ts[6] and sz1~=sz0) and not (ts[7] and fa1~=fa0))
elseif not ts[4] and (ts[2] and C.wcsncmp(st1,st0,ts[3])==0 or C.wcscmp(st1,st0)==0) then Proc(i,C.wcscmp(st3,st2)==0 and not (ts[6] and sz1~=sz0) and not (ts[7] and fa1~=fa0))
end
end
pc(PANEL_ACTIVE,"FCTL_ENDSELECTION",0,nil)
pc(PANEL_ACTIVE,"FCTL_REDRAWPANEL",0,nil)
--Keys("ShiftF12")
if ts[8] then
table.sort(tsel,function(a,b) return a[1]<b[1] end)
local h = io.open(freport,"wb")
io.close(h)
h = io.open(freport,"ab")
h:write("Items: "..#tsel..
"\nExecution time: "..(far.FarClock()-t0)..
" mcs\nNumber of symbols: "..(ts[2] and ts[3] or "all")..
"\nIgnore case: "..tostring(ts[4])..
"\nIgnore Full Duplicates: "..tostring(ts[5])..
(ts[5] and ("\nFD should be the same size: "..tostring(ts[6])) or "")..
(ts[5] and ("\nFD should be the same attributes: "..tostring(ts[7])) or "")..
"\n\n")
for i=#tsel,1,-1 do h:write(tsel[i][1].."\t"..tsel[i][4].."\n") table.remove(tsel) end
io.close(h)
far.Message("mcs: "..far.FarClock()-t0,"SDFN")
end
end
end
end
end;
}

Macro {
description = "SDFN - Help"; area = "Dialog"; key = "F1";
condition=function() return Area.Dialog and Dlg.Id==guid end;
action=function()
if Dlg.CurPos<=3 then far.Message("The number of first or last symbols to compare","Help: Number of symbols")
elseif Dlg.CurPos==4 then far.Message("Case of letters in FileName will be ignored","Help: Ignore case")
elseif Dlg.CurPos==5 then far.Message("Full duplicates of FileName will be ignored","Help: Ignore Full Duplicates")
elseif Dlg.CurPos==6 then far.Message("Full duplicates should be the same size","Help: FD should be the same size")
elseif Dlg.CurPos==7 then far.Message("Full duplicates should be the same attributes","Help: FD should be the same attributes")
elseif Dlg.CurPos==8 then far.Message("mcs - total time of execution in mcs\nReport will be saved to:\n"..freport,"Help: Report",nil,"l")
end
end;
}
Автор: Angel_Ka
Дата сообщения: 13.05.2016 03:59
Alexyz21

Цитата:
13.0.2
[more=падает]
Код: Exception in [W:\FarLce\plugins\luamacro\luamacro.dll] plugin.
==============================================================
System information:
Windows NT, version 10.0.10240
==============================================================
FAR.EXE information:
Version info: 3.0.4670
File size: 4359168 bytes
Time stamp: 12.05.2016 04:04:04
Hdr checksum: 0x0043078E (computed: 0x0043078E)
==============================================================
Exception C0000005 "ACCESS_VIOLATION" at 7700D401 has 0001007F flags.
Attempt to READ at address 00610066
EBP: 00D4F030 EIP: 7700D401 ESP: 00D4EF30 CS: 00000023 SS: 0000002B Flags: 00210246
EDI: 01A80000 ESI: 0861C248 EBX: 08620850 EDX: 0861C250 ECX: 64702E38 EAX: 00610066
GS: 0000002B FS: 00000053 ES: 0000002B DS: 0000002B
Cw: 0000027F Sw: 00000020 Tw: 0000FFFF EOf: 66D81282 Es: 00000000 DOf: 0155DAA0 Ds: 00000000 Cr0: 00000000
dr0: 00000000 dr1: 00000000 dr2: 00000000 dr3: 00000000 dr6: 00000000 dr7: 00000000
==============================================================
Addr[ 1]: 7700D401 Mod:76FD0000 lMod:76FD0000 "ntdll.dll"+0003C801 at ".text"+0003C401
Addr[ 2]: 7704C570 Mod:76FD0000 lMod:76FD0000 "ntdll.dll"+0007B970 at ".text"+0007B570
Addr[ 3]: 7700C6DC Mod:76FD0000 lMod:76FD0000 "ntdll.dll"+0003BADC at ".text"+0003B6DC
Addr[ 4]: 76977765 Mod:76930000 lMod:76930000 "msvcrt.dll"+00046B65 at ".text"+00046765
Addr[ 5]: 66D84873 Mod:66D80000 lMod:66D80000 "lua51.dll"+00003C73 at ".text"+00003873
Addr[ 6]: 66DBA583 Mod:66D80000 lMod:66D80000 "lua51.dll"+00039983 at ".text"+00039583: "lua_dump" + 00023733
Addr[ 7]: 66DBC2CB Mod:66D80000 lMod:66D80000 "lua51.dll"+0003B6CB at ".text"+0003B2CB: "lua_dump" + 0002547B

Stack details:
Addr[ 1]: 7700D401 Mod:76FD0000 lMod:76FD0000 "ntdll.dll"+0003C801 at ".text"+0003C401
Stack: 08620850 08620858 0155DAA0 08620858 00D4F134 01308E60 08620858 76977700 00000000 00000000

Addr[ 2]: 7704C570 Mod:76FD0000 lMod:76FD0000 "ntdll.dll"+0007B970 at ".text"+0007B570
Stack: 00000000 00D4F0BC 76977765 01A80000 00000000 08620858 98DDD3BC 0155DAA0 0000C130 00D4F134

Addr[ 3]: 7700C6DC Mod:76FD0000 lMod:76FD0000 "ntdll.dll"+0003BADC at ".text"+0003B6DC
Stack: 01A80000 00000000 08620858 98DDD3BC 0155DAA0 0000C130 00D4F134 00000B34 00000001 00D4F15C

Addr[ 4]: 76977765 Mod:76930000 lMod:76930000 "msvcrt.dll"+00046B65 at ".text"+00046765
Stack: 08620858 05F19BF8 00D4F15C 66DBA583 05F19BF8 06070118 00D4F15C 0155DA98 00000100 76EEB52D

Addr[ 5]: 66D84873 Mod:66D80000 lMod:66D80000 "lua51.dll"+00003C73 at ".text"+00003873
Stack:
1) 05F19BF8 = 08 00 07 06 2F 0C 00 00 00 10 00 00 60 D7 55 01 ..../.......`ЧU.
2) 06070118 = 01 00 02 20 04 00 00 00 00 00 0F 00 00 00 00 00 ... ............
3) 00D4F15C = 58 08 62 08 CB C2 DB 66 60 D7 55 01 A0 F1 D4 00 X.b.ЛВЫf`ЧU. сФ.
4) 0155DA98 = 50 08 62 08 F5 FF FF FF 00 00 00 00 FF FF FF FF P.b.х...........
5) 00000100 = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
6) 76EEB52D = 85 C0 78 47 85 DB 0F 84 AC 04 03 00 8A C3 24 03 …АxG…Ы.„¬...ЉГ$.
7) 76930000 = 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 MZђ.............
8) 00D4F10C = F8 9B F1 05 00 00 00 00 A0 DA 55 01 38 C1 07 06 ш›с..... ЪU.8Б..
9) 00000000 = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
10) 00D4F114 = A0 DA 55 01 38 C1 07 06 00 00 00 00 00 00 00 00  ЪU.8Б..........
-66D84833 B7 49 mov bh, 49h
-66D84835 06 push es
-66D84836 89 4C 24 30 mov [esp+30h], ecx
-66D8483A 83 C4 1C add esp, 1Ch ;28 "...."
-66D8483D 5B pop ebx
-66D8483E 5E pop esi
-66D8483F 5F pop edi
-66D84840 5D pop ebp
-66D84841 59 pop ecx
-66D84842 03 24 24 add esp, [esp]
-66D84845 83 C4 10 add esp, 10h ;16 "...."
-66D84848 51 push ecx
-66D84849 C3 ret
-66D8484A 55 push ebp
-66D8484B 89 E5 mov ebp, esp
-66D8484D 53 push ebx
-66D8484E 89 CB mov ebx, ecx
-66D84850 2B 63 04 sub esp, [ebx+4]
-66D84853 89 63 04 mov [ebx+4], esp
-66D84856 0F B6 4B 08 movzx ecx, [ebx+8]
-66D8485A 83 E9 01 sub ecx, 1 ;1 "...."
-66D8485D 78 0C js +0Eh ;66D8486B
-66D8485F 8B 44 8B 28 mov eax, [ebx+ecx*4+28h]
-66D84863 89 04 8C mov [esp+ecx*4], eax
-66D84866 83 E9 01 sub ecx, 1 ;1 "...."
-66D84869 79 F4 jns -0Ah ;66D8485F
-66D8486B 8B 4B 20 mov ecx, [ebx+20h]
-66D8486E 8B 53 24 mov edx, [ebx+24h]
-66D84871 FF 13 call dword ptr [ebx]
>66D84873 89 43 20 mov [ebx+20h], eax
+66D84876 89 53 24 mov [ebx+24h], edx
+66D84879 80 7B 0A 01 cmp byte ptr [ebx+0Ah], 1 ;1 "...."
+66D8487D 72 0A jc +0Ch ;66D84889
+66D8487F 74 05 je +7 ;66D84886
+66D84881 DD 5B esc 5, 5Bh
+66D84883 10 EB adc bl, ch
+66D84885 03 D9 add ebx, ecx
+66D84887 5B pop ebx
+66D84888 10 29 adc [ecx], ch
+66D8488A 63 04 8B arpl [ebx+ecx*4], ax
+66D8488D 5D pop ebp
+66D8488E FC cld
+66D8488F C9 leave
+66D84890 C3 ret
+66D84891 db 00h dup (15)
+66D848A0 55 push ebp
+66D848A1 89 C5 mov ebp, eax
+66D848A3 57 push edi
+66D848A4 89 D7 mov edi, edx
+66D848A6 56 push esi
+66D848A7 89 CE mov esi, ecx
+66D848A9 53 push ebx
+66D848AA 83 EC 1C sub esp, 1Ch ;28 "...."
+66D848AD 0F B6 40 1C movzx eax, [eax+1Ch]

Addr[ 6]: 66DBA583 Mod:66D80000 lMod:66D80000 "lua51.dll"+00039983 at ".text"+00039583: "lua_dump" + 00023733
Stack:
1) 0155D760 = E0 D5 55 01 01 06 01 00 F0 01 F1 05 00 00 00 00 аХU.....р.с.....
2) 00D4F1A0 = 38 C1 07 06 00 00 00 00 20 00 00 00 60 D7 55 01 8Б...... ...`ЧU.
3) 05F1B6A8 = 00 00 00 00 21 04 00 00 C3 EB 77 99 04 00 00 00 ....!...Глw™....
4) 00001840 = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
5) 05F19BF8 = 08 00 07 06 2F 0C 00 00 00 10 00 00 60 D7 55 01 ..../.......`ЧU.
6) 05F1B6B8 = 66 72 65 65 00 00 00 00 00 00 00 00 23 00 00 00 free........#...
7) 00000C13 = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
8) 00000001 = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
9) 00000002 = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
10) 00000103 = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
-66DBA543 F2 repne
-66DBA544 83 FE 01 cmp esi, 1 ;1 "...."
-66DBA547 88 54 24 68 mov [esp+68h], dl
-66DBA54B C7 44 24 64 04 00 00 00 mov dword ptr [esp+64h], 4
-66DBA553 76 11 jbe +13h ;66DBA566 lua51.dll::lua_dump+23716h
-66DBA555 8D 04 B5 0B 00 00 00 lea eax, [0Bh+esi*4]
-66DBA55C 83 E0 F0 and eax, -10h ;-16 "...."
-66DBA55F 83 C0 04 add eax, 4 ;4 "...."
-66DBA562 89 44 24 64 mov [esp+64h], eax
-66DBA566 8B 5C 24 38 mov ebx, [esp+38h]
-66DBA56A 8D 4C 24 60 lea ecx, [esp+60h]
-66DBA56E 8B 74 24 44 mov esi, [esp+44h]
-66DBA572 C7 83 94 00 00 00 FF FF FF FFmov dword ptr [ebx+94h], -1
-66DBA57C 2B 33 sub esi, [ebx]
-66DBA57E E8 C7 A2 FC FF call 66D8484Ah ;-35D34h
>66DBA583 83 BB 94 00 00 00 FF cmp dword ptr [ebx+94h], -1 ;-1 "...."
+66DBA58A 74 35 je +37h ;66DBA5C1 lua51.dll::lua_dump+23771h
+66DBA58C 8B 44 24 60 mov eax, [esp+60h]
+66DBA590 C7 44 24 5C FC FF FF FF mov dword ptr [esp+5Ch], -4
+66DBA598 89 44 24 58 mov [esp+58h], eax
+66DBA59C 8D 44 24 58 lea eax, [esp+58h]
+66DBA5A0 89 44 24 08 mov [esp+8], eax
+66DBA5A4 8B 43 18 mov eax, [ebx+18h]
+66DBA5A7 8B 9C 24 30 01 00 00 mov ebx, [esp+130h]
+66DBA5AE 89 44 24 04 mov [esp+4], eax
+66DBA5B2 89 1C 24 mov [esp], ebx
+66DBA5B5 E8 86 D1 FC FF call 66D87740h ;-32E75h lua51.dll::luaL_error+10A0h
+66DBA5BA C7 40 04 FD FF FF FF mov dword ptr [eax+4], -3

Addr[ 7]: 66DBC2CB Mod:66D80000 lMod:66D80000 "lua51.dll"+0003B6CB at ".text"+0003B2CB: "lua_dump" + 0002547B
-66DBC28B 0F 84 82 00 00 00 jz +88h ;66DBC313 lua51.dll::lua_dump+254C3h
-66DBC291 8B 4C 24 14 mov ecx, [esp+14h]
-66DBC295 89 04 24 mov [esp], eax
-66DBC298 89 4C 24 04 mov [esp+4], ecx
-66DBC29C E8 A7 3C 01 00 call 66DCFF48h ;+13CACh lua51.dll::luaL_openlibs+0FB8h
-66DBC2A1 57 push edi
-66DBC2A2 57 push edi
-66DBC2A3 89 C7 mov edi, eax
-66DBC2A5 85 FF test edi, edi
-66DBC2A7 0F 84 89 00 00 00 jz +8Fh ;66DBC336 lua51.dll::lua_dump+254E6h
-66DBC2AD 8B 44 24 20 mov eax, [esp+20h]
-66DBC2B1 89 04 24 mov [esp], eax
-66DBC2B4 E8 9F 3C 01 00 call 66DCFF58h ;+13CA4h lua51.dll::luaL_openlibs+0FC8h
-66DBC2B9 53 push ebx
-66DBC2BA 8B 54 24 10 mov edx, [esp+10h]
-66DBC2BE 8B 4A 0C mov ecx, [edx+0Ch]
-66DBC2C1 BA 0C 00 00 00 mov edx, 0Ch
-66DBC2C6 E8 E5 98 FC FF call 66D85BB0h ;-36716h
>66DBC2CB 0F B7 4C 24 18 movzx ecx, [esp+18h]
+66DBC2D0 C6 40 05 0A mov byte ptr [eax+5], 0Ah
+66DBC2D4 66 89 48 06 mov [eax+6], cx
+66DBC2D8 89 78 08 mov [eax+8], edi
+66DBC2DB 89 45 00 mov [ebp+0], eax
+66DBC2DE C7 45 04 F5 FF FF FF mov dword ptr [ebp+4], -0Bh
+66DBC2E5 E9 00 FF FF FF jmp 66DBC1EAh ;-0FBh lua51.dll::lua_dump+2539Ah
+66DBC2EA 8B 4C 24 10 mov ecx, [esp+10h]
+66DBC2EE 25 FF FF 00 00 and eax, 0FFFFh ;65535 "...."
+66DBC2F3 C1 E0 04 shl eax, 4
+66DBC2F6 03 01 add eax, [ecx]
+66DBC2F8 8B 00 mov eax, [eax]
+66DBC2FA A9 00 00 80 00 test eax, 800000h ;8388608 "..Ђ."
+66DBC2FF 74 07 je +9 ;66DBC308 lua51.dll::lua_dump+254B8h
+66DBC301 8B 42 04 mov eax, [edx+4]
+66DBC304 85 C0 test eax, eax
+66DBC306 78 18 js +1Ah ;66DBC320 lua51.dll::lua_dump+254D0h
+66DBC308 DB 42 esc 3, 42h
Автор: Alexyz21
Дата сообщения: 13.05.2016 07:43

Цитата:
помечает одноимённые файлы с разными размерами
помечает одноимённые файлы с разными атрибутами

И правильно делает - отмечено же Игнорировать полные дубликаты (т.е. не помечать их) и считать полными дубликатами те файлы, которые имеют не только одинаковые имена, но и одинаковые, в первом случае, размеры, а во втором, атрибуты. Соответственно помеченнаются те, у которых размер и атрибуты разные.

Страницы: 123456789101112

Предыдущая тема: кл


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.