View Issue Details

IDProjectCategoryView StatusLast Update
0001742WishesMacropublic2013-02-03 00:33
ReporterDAtaMan Assigned Tovskirdin  
PrioritynormalSeverityfeatureReproducibilityhave not tried
Status closedResolutionfixed 
Product Version3.0 
Fixed in Version3.0 
Summary0001742: Макрофункция CmpName - соответствие текста маске
DescriptionДовольно часто в макросах бывает нужно узнать, соответствует ли текст маске.
В предлагаемом патче реализована макрофункция CmpName.
Steps To ReproduceСинтаксис такой:
N=CmpName(Mask,S[,SkipPath])
Функция регистронезависима.

Примеры:
cmpname("*far*", "far manager") == 1
cmpname("a.txt", @"c:\a.txt", 0) == 1
cmpname("a.txt", @"c:\a.txt", 0) == 0
cmpname("a.txt", @"c:\a.txt", 1) == 1
TagsNo tags attached.
Build1946

Activities

DAtaMan

2011-04-04 23:35

reporter  

macro.diff.7z (1,063 bytes)

vskirdin

2011-04-05 06:49

administrator   bugnote:0006661

build 1942

vskirdin

2011-04-05 09:18

administrator   bugnote:0006667

а может имеет смысл переделать (и переименовать) функцию вот так (применив ProcessName()):

N=ProcessName(Mask,Name[,Flags])

Здесь значение Flags как у PROCESSNAME_FLAGS (см. plugin.hpp)

?

JohnDoe

2011-04-05 09:47

updater   bugnote:0006668

Last edited: 2011-04-05 09:48

А может тогда уж сделать универсальную функцию, с поддержной регэкспов?
И обязательно ли привязываться к именам файлов? Может пусть будет произвольный текст?

vskirdin

2011-04-05 10:46

administrator   bugnote:0006672

никто не мешает ЭТО (регэкспы) сделать потом внутри, а в писании (потом) написать, мол можно юзать их.
опять же, работа с путями - это частный случай.
если не нравится cmpname или processname - выкатывай свою версию.

JohnDoe

2011-04-05 12:33

updater   bugnote:0006678

Last edited: 2011-04-05 12:37

>если не нравится cmpname или processname - выкатывай свою версию.
Мне нравится cmpname, а processname ещё больше (но с оговорками).

Вопрос: может стоит сделать функцию ещё более общей? Не факт что стоит чересчур обобщать. Хотелось бы знать какие на этот счёт есть мнения.

1. Флаг маски/регэкспы определённо никому не помешает.
2. Стоит ли привязываться к файлам, или можно обобщить до любых строк.

vskirdin

2011-04-05 12:50

administrator   bugnote:0006682

здесь и так любые строк, но в маске юзается '*' и '?' (потом будут regexp)
приведенные примеры рассмотри.

JohnDoe

2011-04-05 13:16

updater   bugnote:0006683

Last edited: 2011-04-05 13:21

>static const PROCESSNAME_FLAGS
> PN_CMPNAME = 0x0000000000000000ULL,
> PN_CMPNAMELIST = 0x0000000000010000ULL,
> PN_GENERATENAME = 0x0000000000020000ULL,
> PN_SKIPPATH = 0x0000000001000000ULL;
Из всего перечисленного очевидно только SKIPPATH
Вероятно CMPNAME/CMPNAMELIST это альтернативы.
GENERATENAME похоже к делу не относится.
Так?

vskirdin

2011-04-05 13:29

administrator   bugnote:0006686

PN_CMPNAME - это то, что сейчас CmpName
PN_SKIPPATH - это то, что сейчас CmpName(Mask,S,1)
PN_CMPNAMELIST - список масок, разделенных запятой
PN_GENERATENAME - генерация нового имени по маске

Про PN_GENERATENAME (processname.cpp, ConvertWildcards()):

// На основе имени файла (Src) и маски (Dest) генерируем новое имя
// SelectedFolderNameLength - длина каталога. Например, есть
// каталог dir1, а в нем файл file1. Нужно сгенерировать имя по маске для dir1.
// Параметры могут быть следующими: Src="dir1", SelectedFolderNameLength=0
// или Src="dir1\\file1", а SelectedFolderNameLength=4 (длина "dir1")

JohnDoe

2011-04-05 13:37

updater   bugnote:0006687

>PN_GENERATENAME - генерация нового имени по маске
Что-то не могу сообразить как это применимо в рамках текущего тикета?

vskirdin

2011-04-05 14:14

administrator   bugnote:0006690

не запоминай. в движке юзаются уже готовые функции, так что могут быть "побочные эффекты"

DAtaMan

2011-04-05 16:00

reporter   bugnote:0006697

Index: macro.cpp
===================================================================
--- macro.cpp (revision 5918)
+++ macro.cpp (working copy)
@@ -3746,11 +3746,15 @@
 // N=CmpName(Mask,S[,SkipPath])
 static bool cmpnameFunc(const TMacroFunction*)
 {
+ int Flags = PN_CMPNAMELIST;
     bool SkipPath = (bool) VMStack.Pop().getInteger();
- TVar S2; VMStack.Pop(S2);
+ TVar S; VMStack.Pop(S);
     TVar Mask; VMStack.Pop(Mask);
 
- int i = CmpName(Mask.toString(), S2.toString(), SkipPath);
+ if (SkipPath)
+ Flags |= PN_SKIPPATH;
+
+ size_t i = ProcessName(Mask.toString(), (wchar_t *)S.toString(), 0, Flags);
     VMStack.Push(TVar((__int64)(i)));
 
     return true;

DAtaMan

2011-04-05 16:02

reporter   bugnote:0006698

>применив ProcessName()
Спасибо, применил.

>И обязательно ли привязываться к именам файлов?
В текущем виде функция больше применима к именам файлов - из-за регистронезависимости.

Для регэкспов хочется иметь набор функций, с namespace "RE."

JohnDoe

2011-04-05 16:20

updater   bugnote:0006699

Last edited: 2011-04-05 16:28

>Для регэкспов хочется иметь набор функций, с namespace "RE."
Это да, но почему бы не иметь регэкспы и тут, ведь сам фар понимает регэкспы, в тех же местах где маски.

А RE.xxx это уже отдельная история.
(тема на форуме тут http://forum.farmanager.com/viewtopic.php?f=15&t=6013)

P.S.
А вот тема прямо как по тикету http://forum.farmanager.com/viewtopic.php?f=15&t=5389

vskirdin

2011-04-05 16:27

administrator   bugnote:0006700

> Спасибо, применил.
Ну, в таком виде это лишнее.
Я имел ввиду, чтобы третий параметр был не SkipPath, а Flags.

> А RE.xxx это уже отдельная история.
Угу. И она произойдет после внедрения ProcessMacro (т.е. регулярка в виде "Re.XXX" будет лежать на плечах очередного плагина :-))

JohnDoe

2011-04-05 16:29

updater   bugnote:0006701

>И она произойдет после внедрения ProcessMacro
Дождёмся ли?

DAtaMan

2011-04-05 18:26

reporter  

FMatch.diff.7z (1,514 bytes)

DAtaMan

2011-04-05 18:27

reporter   bugnote:0006707

Last edited: 2011-04-05 18:31

Переименовал в FMatch(S,Mask), с поддержкой регэкспов
Годится ?

vskirdin

2011-04-06 05:11

administrator   bugnote:0006710

ну наверное да :-)
и описание для Писания...
можно сюда

vskirdin

2011-04-06 11:00

administrator   bugnote:0006715

build 1946
N=FMatch(S, Mask)

DAtaMan

2011-04-09 11:48

reporter  

macro.diff (1,724 bytes)   
Index: macro.cpp
===================================================================
--- macro.cpp	(revision 5937)
+++ macro.cpp	(working copy)
@@ -77,6 +77,7 @@
 #include "dirmix.hpp"
 #include "console.hpp"
 #include "imports.hpp"
+#include "FileMasksProcessor.hpp"
 #include "CFileMask.hpp"
 
 // �� ������� �������� ������
@@ -296,7 +297,6 @@
 static bool beepFunc(const TMacroFunction*);
 static bool callpluginFunc(const TMacroFunction*);
 static bool chrFunc(const TMacroFunction*);
-static bool fmatchFunc(const TMacroFunction*);
 static bool clipFunc(const TMacroFunction*);
 static bool dateFunc(const TMacroFunction*);
 static bool dlggetvalueFunc(const TMacroFunction*);
@@ -310,6 +310,7 @@
 static bool fexistFunc(const TMacroFunction*);
 static bool floatFunc(const TMacroFunction*);
 static bool flockFunc(const TMacroFunction*);
+static bool fmatchFunc(const TMacroFunction*);
 static bool fsplitFunc(const TMacroFunction*);
 static bool iifFunc(const TMacroFunction*);
 static bool indexFunc(const TMacroFunction*);
@@ -3750,20 +3751,18 @@
 	return true;
 }
 
-// N=FMatch(S, Mask)
+// N=FMatch(S,Mask)
 static bool fmatchFunc(const TMacroFunction*)
 {
-	TVar Mask;  VMStack.Pop(Mask);
+	TVar Mask; VMStack.Pop(Mask);
 	TVar S;    VMStack.Pop(S);
 	CFileMask FileMask;
 
-	bool Ret = FileMask.Set(Mask.toString(), 0);
-	if (Ret && FileMask.Set(Mask.toString(), FMF_SILENT))
-	  Ret = FileMask.Compare(S.toString());
-
-	VMStack.Push(Ret?1:0);
-
-	return Ret?true:false;
+	if (FileMask.Set(Mask.toString(), FMF_SILENT))
+		VMStack.Push(FileMask.Compare(S.toString()));
+	else
+		VMStack.Push(-1);
+	return true;
 }
 
 // V=Editor.Sel(Action[,Opt])
macro.diff (1,724 bytes)   

DAtaMan

2011-04-09 11:52

reporter   bugnote:0006727

Last edited: 2011-04-09 20:30

Извиняюсь за паузу.

Ещё уточнение.
Теперь функция возвращает:
1 - при соответствии с маской
0 - при несоответствии с маской
-1 - при некорректной маске (ошибке в регэкспе)

Про Писание. Куда функцию "прописать", в строковые или в файловые ?
Она и туда и туда подходит :)

DAtaMan

2011-04-11 00:43

reporter  

general.html.diff (1,956 bytes)   
Index: general.html
===================================================================
--- general.html	(revision 5939)
+++ general.html	(working copy)
@@ -768,6 +768,39 @@
        <p>� ������ �� <a href="panels.html#panel.fattr">panel.fattr()</a>, ����� �� �������� � �������.</p>
     </td>
   </tr>
+  <tr>
+    <td>N=<dfn><a name="FMatch">FMatch</a></dfn>(S,Mask)</td>
+    <td><p>��������� ������ <var>S</var> �� ������������ ����� <var>Mask</var>.</p>
+       <p><var>Mask</var> ����� ��:</p>
+       <p> - ������</p>
+       <p> - ������� ����� (�������� ������ ��� ����� � ������)</p>
+       <p> - ������ ������� - ����� ��� ���������� ������� ������, ������� �� ������ �������������� ������ <var>S</var>.
+       ����� ������� �������� �� �������� ����� �������� |</p>
+       <p> - �������� ���������. ����� ���������� ������� ������ �� ������ ��������� /</p>
+       <p>���������:</p>
+       <table class="cont2 params lite tiny">
+       <col class="value">
+       <col>
+       <tr><th>�������</th><th>��������</th></tr>
+        <tr><td> 1</td><td>������ ������������� �����</td></tr>
+        <tr><td> 0</td><td>������ �� ������������� �����</td></tr>
+        <tr><td>-1</td><td>����� � ��������� ��������</td></tr>
+       </table>
+       <p>������</p>
+       <table class="cont2 params lite tiny">
+         <col>
+         <col>
+         <tr>
+           <th>����</th>
+           <th>��������</th>
+         </tr>
+          <tr><td>FMatch("Readme.txt", "*.txt")</td><td>��������� 1</td></tr>
+          <tr><td>FMatch("Readme.txt", "Readme.*|*.txt")</td><td>��������� 0</td></tr>
+          <tr><td>FMatch(@"c:\Readme.txt", @"/txt$/i")</td><td>��������� 1</td></tr>
+          <tr><td>FMatch(@"c:\Readme.txt", @"/txt$")</td><td>��������� -1</td></tr>
+       </table>
+    </td>
+  </tr>
 </table>
 
 <h3>�������������� � ������������</h3>
general.html.diff (1,956 bytes)   

DAtaMan

2011-04-11 00:47

reporter   bugnote:0006730

Добавил diff для Писания.

Я в предыдущем комментарии накосячил, и в changelog попало неправильное описание результатов.
Исправьте, пожалуйста.

vskirdin

2011-04-11 08:59

administrator   bugnote:0006733

применил патч, скорректировал changelog

Issue History

Date Modified Username Field Change
2011-04-04 23:35 DAtaMan New Issue
2011-04-04 23:35 DAtaMan File Added: macro.diff.7z
2011-04-05 06:49 vskirdin Note Added: 0006661
2011-04-05 06:49 vskirdin Assigned To => vskirdin
2011-04-05 06:49 vskirdin Status new => feedback
2011-04-05 09:18 vskirdin Note Added: 0006667
2011-04-05 09:47 JohnDoe Note Added: 0006668
2011-04-05 09:48 JohnDoe Note Edited: 0006668
2011-04-05 10:46 vskirdin Note Added: 0006672
2011-04-05 12:33 JohnDoe Note Added: 0006678
2011-04-05 12:35 JohnDoe Note Edited: 0006678
2011-04-05 12:37 JohnDoe Note Edited: 0006678
2011-04-05 12:50 vskirdin Note Added: 0006682
2011-04-05 13:16 JohnDoe Note Added: 0006683
2011-04-05 13:21 JohnDoe Note Edited: 0006683
2011-04-05 13:29 vskirdin Note Added: 0006686
2011-04-05 13:37 JohnDoe Note Added: 0006687
2011-04-05 14:14 vskirdin Note Added: 0006690
2011-04-05 16:00 DAtaMan Note Added: 0006697
2011-04-05 16:00 DAtaMan Status feedback => assigned
2011-04-05 16:02 DAtaMan Note Added: 0006698
2011-04-05 16:20 JohnDoe Note Added: 0006699
2011-04-05 16:26 JohnDoe Note Edited: 0006699
2011-04-05 16:27 vskirdin Note Added: 0006700
2011-04-05 16:28 JohnDoe Note Edited: 0006699
2011-04-05 16:29 JohnDoe Note Added: 0006701
2011-04-05 18:26 DAtaMan File Added: FMatch.diff.7z
2011-04-05 18:27 DAtaMan Note Added: 0006707
2011-04-05 18:31 DAtaMan Note Edited: 0006707
2011-04-06 05:11 vskirdin Note Added: 0006710
2011-04-06 11:00 vskirdin Note Added: 0006715
2011-04-06 11:00 vskirdin Status assigned => feedback
2011-04-09 11:48 DAtaMan File Added: macro.diff
2011-04-09 11:52 DAtaMan Note Added: 0006727
2011-04-09 11:52 DAtaMan Status feedback => assigned
2011-04-09 12:08 DAtaMan Note Edited: 0006727
2011-04-09 20:30 DAtaMan Note Edited: 0006727
2011-04-11 00:43 DAtaMan File Added: general.html.diff
2011-04-11 00:47 DAtaMan Note Added: 0006730
2011-04-11 08:59 vskirdin Note Added: 0006733
2011-04-11 08:59 vskirdin Status assigned => feedback
2012-06-08 14:47 DAtaMan Status feedback => resolved
2012-06-09 05:57 vskirdin Build => 1946
2012-06-09 05:57 vskirdin Status resolved => closed
2012-06-09 05:58 vskirdin Resolution open => fixed
2012-06-09 05:58 vskirdin Fixed in Version => 3.0
2013-02-03 00:33 alexy Severity minor => feature