View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0001742 | Wishes | Macro | public | 2011-04-04 22:35 | 2013-02-03 00:33 |
| Reporter | DAtaMan | Assigned To | vskirdin | ||
| Priority | normal | Severity | feature | Reproducibility | have not tried |
| Status | closed | Resolution | fixed | ||
| Product Version | 3.0 | ||||
| Fixed in Version | 3.0 | ||||
| Summary | 0001742: Макрофункция 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 | ||||
| Tags | No tags attached. | ||||
| Build | 1946 | ||||
|
|
|
|
|
build 1942 |
|
|
а может имеет смысл переделать (и переименовать) функцию вот так (применив ProcessName()): N=ProcessName(Mask,Name[,Flags]) Здесь значение Flags как у PROCESSNAME_FLAGS (см. plugin.hpp) ? |
|
|
А может тогда уж сделать универсальную функцию, с поддержной регэкспов? И обязательно ли привязываться к именам файлов? Может пусть будет произвольный текст? |
|
|
никто не мешает ЭТО (регэкспы) сделать потом внутри, а в писании (потом) написать, мол можно юзать их. опять же, работа с путями - это частный случай. если не нравится cmpname или processname - выкатывай свою версию. |
|
|
>если не нравится cmpname или processname - выкатывай свою версию. Мне нравится cmpname, а processname ещё больше (но с оговорками). Вопрос: может стоит сделать функцию ещё более общей? Не факт что стоит чересчур обобщать. Хотелось бы знать какие на этот счёт есть мнения. 1. Флаг маски/регэкспы определённо никому не помешает. 2. Стоит ли привязываться к файлам, или можно обобщить до любых строк. |
|
|
здесь и так любые строк, но в маске юзается '*' и '?' (потом будут regexp) приведенные примеры рассмотри. |
|
|
>static const PROCESSNAME_FLAGS > PN_CMPNAME = 0x0000000000000000ULL, > PN_CMPNAMELIST = 0x0000000000010000ULL, > PN_GENERATENAME = 0x0000000000020000ULL, > PN_SKIPPATH = 0x0000000001000000ULL; Из всего перечисленного очевидно только SKIPPATH Вероятно CMPNAME/CMPNAMELIST это альтернативы. GENERATENAME похоже к делу не относится. Так? |
|
|
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") |
|
|
>PN_GENERATENAME - генерация нового имени по маске Что-то не могу сообразить как это применимо в рамках текущего тикета? |
|
|
не запоминай. в движке юзаются уже готовые функции, так что могут быть "побочные эффекты" |
|
|
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; |
|
|
>применив ProcessName() Спасибо, применил. >И обязательно ли привязываться к именам файлов? В текущем виде функция больше применима к именам файлов - из-за регистронезависимости. Для регэкспов хочется иметь набор функций, с namespace "RE." |
|
|
>Для регэкспов хочется иметь набор функций, с 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 |
|
|
> Спасибо, применил. Ну, в таком виде это лишнее. Я имел ввиду, чтобы третий параметр был не SkipPath, а Flags. > А RE.xxx это уже отдельная история. Угу. И она произойдет после внедрения ProcessMacro (т.е. регулярка в виде "Re.XXX" будет лежать на плечах очередного плагина :-)) |
|
|
>И она произойдет после внедрения ProcessMacro Дождёмся ли? |
|
|
|
|
|
Переименовал в FMatch(S,Mask), с поддержкой регэкспов Годится ? |
|
|
ну наверное да :-) и описание для Писания... можно сюда |
|
|
build 1946 N=FMatch(S, Mask) |
|
|
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])
|
|
|
Извиняюсь за паузу. Ещё уточнение. Теперь функция возвращает: 1 - при соответствии с маской 0 - при несоответствии с маской -1 - при некорректной маске (ошибке в регэкспе) Про Писание. Куда функцию "прописать", в строковые или в файловые ? Она и туда и туда подходит :) |
|
|
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>
|
|
|
Добавил diff для Писания. Я в предыдущем комментарии накосячил, и в changelog попало неправильное описание результатов. Исправьте, пожалуйста. |
|
|
применил патч, скорректировал changelog |
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2011-04-04 22:35 | DAtaMan | New Issue | |
| 2011-04-04 22:35 | DAtaMan | File Added: macro.diff.7z | |
| 2011-04-05 05:49 | vskirdin | Note Added: 0006661 | |
| 2011-04-05 05:49 | vskirdin | Assigned To | => vskirdin |
| 2011-04-05 05:49 | vskirdin | Status | new => feedback |
| 2011-04-05 08:18 | vskirdin | Note Added: 0006667 | |
| 2011-04-05 08:47 | JohnDoe | Note Added: 0006668 | |
| 2011-04-05 08:48 | JohnDoe | Note Edited: 0006668 | |
| 2011-04-05 09:46 | vskirdin | Note Added: 0006672 | |
| 2011-04-05 11:33 | JohnDoe | Note Added: 0006678 | |
| 2011-04-05 11:35 | JohnDoe | Note Edited: 0006678 | |
| 2011-04-05 11:37 | JohnDoe | Note Edited: 0006678 | |
| 2011-04-05 11:50 | vskirdin | Note Added: 0006682 | |
| 2011-04-05 12:16 | JohnDoe | Note Added: 0006683 | |
| 2011-04-05 12:21 | JohnDoe | Note Edited: 0006683 | |
| 2011-04-05 12:29 | vskirdin | Note Added: 0006686 | |
| 2011-04-05 12:37 | JohnDoe | Note Added: 0006687 | |
| 2011-04-05 13:14 | vskirdin | Note Added: 0006690 | |
| 2011-04-05 15:00 | DAtaMan | Note Added: 0006697 | |
| 2011-04-05 15:00 | DAtaMan | Status | feedback => assigned |
| 2011-04-05 15:02 | DAtaMan | Note Added: 0006698 | |
| 2011-04-05 15:20 | JohnDoe | Note Added: 0006699 | |
| 2011-04-05 15:26 | JohnDoe | Note Edited: 0006699 | |
| 2011-04-05 15:27 | vskirdin | Note Added: 0006700 | |
| 2011-04-05 15:28 | JohnDoe | Note Edited: 0006699 | |
| 2011-04-05 15:29 | JohnDoe | Note Added: 0006701 | |
| 2011-04-05 17:26 | DAtaMan | File Added: FMatch.diff.7z | |
| 2011-04-05 17:27 | DAtaMan | Note Added: 0006707 | |
| 2011-04-05 17:31 | DAtaMan | Note Edited: 0006707 | |
| 2011-04-06 04:11 | vskirdin | Note Added: 0006710 | |
| 2011-04-06 10:00 | vskirdin | Note Added: 0006715 | |
| 2011-04-06 10:00 | vskirdin | Status | assigned => feedback |
| 2011-04-09 10:48 | DAtaMan | File Added: macro.diff | |
| 2011-04-09 10:52 | DAtaMan | Note Added: 0006727 | |
| 2011-04-09 10:52 | DAtaMan | Status | feedback => assigned |
| 2011-04-09 11:08 | DAtaMan | Note Edited: 0006727 | |
| 2011-04-09 19:30 | DAtaMan | Note Edited: 0006727 | |
| 2011-04-10 23:43 | DAtaMan | File Added: general.html.diff | |
| 2011-04-10 23:47 | DAtaMan | Note Added: 0006730 | |
| 2011-04-11 07:59 | vskirdin | Note Added: 0006733 | |
| 2011-04-11 07:59 | vskirdin | Status | assigned => feedback |
| 2012-06-08 13:47 | DAtaMan | Status | feedback => resolved |
| 2012-06-09 04:57 | vskirdin | Build | => 1946 |
| 2012-06-09 04:57 | vskirdin | Status | resolved => closed |
| 2012-06-09 04:58 | vskirdin | Resolution | open => fixed |
| 2012-06-09 04:58 | vskirdin | Fixed in Version | => 3.0 |
| 2013-02-03 00:33 | alexy | Severity | minor => feature |