Skip to content

Commit 0cf96e0

Browse files
committed
#107: Функция СтрЧислоВхождений
1 parent 721785b commit 0cf96e0

File tree

6 files changed

+49
-0
lines changed

6 files changed

+49
-0
lines changed

src/ScriptEngine/Compiler/Compiler.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1411,6 +1411,8 @@ private OperationCode BuiltInFunctionCode(Token token)
14111411
return OperationCode.EmptyStr;
14121412
case Token.StrReplace:
14131413
return OperationCode.StrReplace;
1414+
case Token.StrEntryCount:
1415+
return OperationCode.StrEntryCount;
14141416
case Token.Year:
14151417
return OperationCode.Year;
14161418
case Token.Month:

src/ScriptEngine/Compiler/Tokens.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ static LanguageDef()
132132
_stringToToken.Add("кодсимвола", Token.ChrCode);
133133
_stringToToken.Add("пустаястрока", Token.EmptyStr);
134134
_stringToToken.Add("стрзаменить", Token.StrReplace);
135+
_stringToToken.Add("стрчисловхождений", Token.StrEntryCount);
135136

136137
_stringToToken.Add("год", Token.Year);
137138
_stringToToken.Add("месяц", Token.Month);
@@ -329,6 +330,7 @@ enum Token
329330
ChrCode,
330331
EmptyStr,
331332
StrReplace,
333+
StrEntryCount,
332334
Year,
333335
Month,
334336
Day,

src/ScriptEngine/Machine/BuiltinFunctions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ private static void InitParametersInfo()
5353
map.Add(OperationCode.ChrCode, SingleDefaultParamInfo);
5454
map.Add(OperationCode.EmptyStr, SingleDefaultParamInfo);
5555
map.Add(OperationCode.StrReplace, StrReplaceParamInfo);
56+
map.Add(OperationCode.StrEntryCount, TwoDefaultParamsInfo);
5657
// date
5758
map.Add(OperationCode.Year, SingleDefaultParamInfo);
5859
map.Add(OperationCode.Month, SingleDefaultParamInfo);

src/ScriptEngine/Machine/Core.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ enum OperationCode
7979
ChrCode,
8080
EmptyStr,
8181
StrReplace,
82+
StrEntryCount,
8283
Year,
8384
Month,
8485
Day,

src/ScriptEngine/Machine/MachineInstance.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,7 @@ private void InitCommands()
434434
ChrCode,
435435
EmptyStr,
436436
StrReplace,
437+
StrEntryCount,
437438
Year,
438439
Month,
439440
Day,
@@ -1613,6 +1614,28 @@ private void StrReplace(int arg)
16131614
NextInstruction();
16141615
}
16151616

1617+
private void StrEntryCount(int arg)
1618+
{
1619+
var what = _operationStack.Pop().AsString();
1620+
var where = _operationStack.Pop().AsString();
1621+
1622+
var pos = where.IndexOf(what);
1623+
var entryCount = 0;
1624+
while(pos >= 0)
1625+
{
1626+
entryCount++;
1627+
var nextIndex = pos + what.Length;
1628+
if (nextIndex >= where.Length)
1629+
break;
1630+
1631+
pos = where.IndexOf(what, nextIndex);
1632+
}
1633+
1634+
_operationStack.Push(ValueFactory.Create(entryCount));
1635+
1636+
NextInstruction();
1637+
}
1638+
16161639
private void Year(int arg)
16171640
{
16181641
var date = _operationStack.Pop().AsDate().Year;

tests/global-funcs.os

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
4343
ВсеТесты.Добавить("Тест_ДолженПроверитьЧтоФункцияМаксНеСравниваетРазнотипныеЗначения");
4444

4545
ВсеТесты.Добавить("Тест_ДолженПроверитьЧтоКопированиеФайлаПерезаписываетПриемник");
46+
ВсеТесты.Добавить("Тест_ДолженПроверитьСтрЧислоВхожденийВхожденийНет");
47+
ВсеТесты.Добавить("Тест_ДолженПроверитьСтрЧислоВхождений");
4648

4749
Возврат ВсеТесты;
4850
КонецФункции
@@ -338,3 +340,21 @@
338340
УдалитьФайлы(Источник);
339341

340342
КонецПроцедуры
343+
344+
Процедура Тест_ДолженПроверитьСтрЧислоВхожденийВхожденийНет() Экспорт
345+
346+
ГдеИскать = "Здесь был Ежик. Ежик любит грибы, Я Ежик!!!";
347+
ЧтоИскать = "колбаса";
348+
349+
юТест.ПроверитьРавенство(0, СтрЧислоВхождений(ГдеИскать, ЧтоИскать));
350+
351+
КонецПроцедуры
352+
353+
Процедура Тест_ДолженПроверитьСтрЧислоВхождений() Экспорт
354+
355+
ГдеИскать = "Здесь был Ежик. Ежик любит грибы, Я Ежик!!!";
356+
ЧтоИскать = "Ежик";
357+
358+
юТест.ПроверитьРавенство(3, СтрЧислоВхождений(ГдеИскать, ЧтоИскать));
359+
360+
КонецПроцедуры

0 commit comments

Comments
 (0)