PDA

Просмотр полной версии : [Include] TDW String Library



VVWVV
13.10.2016, 00:00
TDW String Library
github (https://github.com/TDW-org/samp-include-string)

Описание:
Добавляет большое количество новых функций для работы со строками.

Функции:


Функция
Описание
Возвращает


erase_first(string[], const find[], bool:ignorecase = false, pos = 0)
Вырезает первую найденную подстроку(find) из строки.
Позицию начала подстроки в строке

erase_last(string[], const find[], bool:ignorecase = false)
Вырезает последнюю найденную подстроку(find) из строки.
Позицию начала подстроки в строке

erase_nth(string[], const find[], n, bool:ignorecase = false, pos = 0)
Вырезает 'n' найденных подстрок
-1

erase(string[], start_pos, length = cellmax)
Вырезает определённое количество символов, заданных в start_pos(начало) и length(количество символов)
-1

find_first(const string[], const find[], bool:ignorecase = false, pos = 0)
Ищет подстроку(find) в строке
Позицию начала подстроки в строке, в противном случае -1

find_last(const string[], const find[], bool:ignorecase = false)
Ищет последнюю найденную подстроку(find) из строки.
Позицию начала подстроки в строке, в противном случае -1

find_first_of(const string[], const charlist[], pos_string = 0, size = sizeof string)
Ищет первый попавшийся символ из массива(charlist) в строке.
Позицию первого попавшегося символа в строке, в противном случае -1

find_last_of(const string[], const charlist[])
Ищет первый попавшийся символ из массива(charlist) с конца строки.
Позицию первого попавшегося символа с конца строки, в противном случае -1

find_first_not_of(const string[], const charlist[], pos_string = 0, size = sizeof string)
Ищет первый попавшийся символ не из массива(charlist) в строке.
Позицию первого попавшегося символа в строке, в противном случае -1

find_last_not_of(const string[], const charlist[])
Ищет первый попавшийся символ не из массива(charlist) с конца строки.
Позицию первого попавшегося символа в строке, в противном случае -1

replace_first(string[], const find[], const replace[], bool:ignorecase = false, pos = 0, string_size = sizeof string)
Заменяет первую найденную подстроку(find) строкой(replace).
Если строка найдена - 1, в противном случае 0.

replace_last(string[], const find[], const replace[], bool:ignorecase = false, pos = 0, string_size = sizeof string)
Заменяет последнюю найденную подстроку(find) строкой(replace).
Если строка найдена - 1, в противном случае 0.

replace_nth(string[], const find[], const replace[], n, bool:ignorecase = false, pos = 0, string_size = sizeof string)
Заменяет 'n' найденных подстрок(find) строкой(replace)
Если строка найдена - 1, в противном случае 0.

replace_all(string[], const find[], const replace[], bool:ignorecase = false, pos = 0, string_size = sizeof string)
Заменяет все подстроки(find) строкой(replace)
Если строка найдена - 1, в противном случае 0.

IsPackedString(string[])
Определяет формат записи строки в памяти.
Возвращает true, если строка упакована, в противном случае - false

IsEmptyString(const string[])

Возвращает true, если строка пустая, в противном случае - false

memcmp(const string1[], const string2[], n = cellmax, size_1 = sizeof string1, size_2 = sizeof string2)
Проверяет строки в памяти на соответствие между ними.
Возвращает 0, если блоки идентичны

strcount(const string[], const find[], bool:ignorecase = false, pos = 0, string_size = sizeof string)
Подсчитывает количество подстрок(find) в строке
Количество вложенных подстрок

strreverse(string[])
Переворачивает строку
-

trim_left(string[], const delimiter = ' ')
Обрезает символы(delimiter) с начала строки
-

trim_right(string[], const delimiter = ' ')
Обрезает символы(delimiter) с конца строки
-

trim(string[], const delimiter = ' ')
Обрезает символы(delimiter) с двух сторон строки
-

strparttoupper(string[], part_start, part_end, string_size = sizeof string)
Данная функция изменяет строчные буквы на заглавные на отдельных участках строки.
-

strparttolower(string[], part_start, part_end, string_size = sizeof string)
Данная функция изменяет заглавные на строчные буквы на отдельных участках строки.
-

countofuppercase(const string[])
Подсчитывают количество заглавных букв в строке.
число (процент)

countoflowpercase(const string[])
Подсчитывают количество строчных букв в строке.
число (процент)

strtrtrans(string[])
Переводит русские символы в транслитерацию.
-

islowerpart(const string[], start_part_pos, end_part_pos)
Проверяет отдельный участок кода на наличие символов в нижним регистре.
Возвращает true, если в отдельный участке все символы в нижним регистре, иначе false.

isupperpart(const string[], start_part_pos, end_part_pos)
Проверяет отдельный участок кода на наличие символов в верхнем регистре.
Возвращает true, если в отдельный участке все символы в верхнем регистре, иначе false.

strcatex(dest[], size, const ...)
Соединяет строки друг с другом по средством strcat.
Возвращает количество символов.

strfill(string[], const pattern[] = " ", fill_length, E_TDW_FILL_TYPE:type = FILL_TYPE_BOTH, size = sizeof string)
Заполняет строку указанной подстрокой.
Возвращает 1, если fill_length меньше чем size, иначе 0.

strimplodeex(dest[], const delimiter[] = !" ", dest_size = sizeof dest, const ...)
Заполняет строки с разделителем(delimiter).
Количество символов (без размера разделителя).

strimplode(dest[], const arrays[][], const delimiter[] = !" ", array_items = sizeof arrays, dest_size = sizeof dest)
Тоже самое, что и strimplodeex, однако значения берутся из массива.
-

strsplit(dest[], const string[], &index, const seperator = ' ')
Подобие strtok, но в более лучшем виде. Примечание: не работает с упакованными строками.
-

replace_sumbol(string[], find[2], replace, pos = 0)
Заменяет один символ в строке.
-


Скачать:

github (https://github.com/TDW-org/samp-include-string)

Установка:

Скачать библиотеку (https://github.com/TDW-org/samp-include-string).
Все файлы, точнее библиотеки, переместить в папку 'pawno/includes'. Впрочем, можно воспользоваться флагом '-i<путь>' для указания альтернативного пути для библиотек.
Библиотеки необходимо подключать после файла 'a_samp'.
Пример:


#include <a_samp>
#include <tdw_string>
Скомпилировать изменённые вами скрипты.


Благодарности:

Untonyst (оптимизация/составление функций)
Nexius (идеи некоторых функций)
ziggi (советы и идеи к функциям)
DeimoS (фикс функции)


Распространяется по лицензии ZLIB.

ziggi
14.10.2016, 21:15
Почему для find_first есть pos, а для find_first_of и других подобных функций этого параметра нет?
Что насчёт compare или isequal? Для замены багнутого strcmp. Вижу memcmp, но он требует указание длины, в принципе этот параметр можно сделать не обязательным, как сделано в stcmp.
Ещё бы не помешали какие-нибудь strtoupper и strtolower, для перевода всей (или части) строки в верхний и нижний регистр соответственно. Только с учётом кириллицы.

А в целом - круто, жаль что в Pawn нельзя сделать поддержку перегрузки операторов для массивов. Было бы классно склеивать строки через + и сравнивать через ==.
P.S. Закинь в README список функций, так будет удобнее.
P.P.S. Вот ещё отсюда (https://github.com/oscar-broman/strlib) можно позаимствовать некоторые функции.

VVWVV
14.10.2016, 21:27
Почему для find_first есть pos, а для find_first_of и других подобных функций этого параметра нет?
Что насчёт compare или isequal? Для замены багнутого strcmp. Вижу memcmp, но он требует указание длины, в принципе этот параметр можно сделать не обязательным, как сделано в stcmp.
Ещё бы не помешали какие-нибудь strtoupper и strtolower, для перевода всей (или части) строки в верхний и нижний регистр соответственно. Только с учётом кириллицы.

Спасибо, учту все предложения.

UPD: Добавил.



А в целом - круто, жаль что в Pawn нельзя сделать поддержку перегрузки операторов для массивов. Было бы классно склеивать строки через + и сравнивать через ==.

Я делал что-то подобное, но смутил синтаксис (вот коммит удаления (https://github.com/TDW-org/samp-include-string/commit/7789a48d330f77623d618f85ebd8bc3ab8242973)).

ziggi
14.10.2016, 21:37
Я делал что-то подобное, но смутил синтаксис (вот коммит удаления (https://github.com/TDW-org/samp-include-string/commit/7789a48d330f77623d618f85ebd8bc3ab8242973)).

И как оно выглядело?

VVWVV
14.10.2016, 21:46
И как оно выглядело?

Как-то так:


new a[10], b[3];
s<a = b>; // strcpy
s<--a[,]>; // strdel
s<a ?? "b"!>; // strfind(a, "b", true, 0)
s<a + b>; // strcat(...)


Взял синтаксис от Python и Haskell.

VVWVV
27.10.2016, 00:38
Обновление 03/10/2016 (версия: 1.1.8):
- Добавлены функции strparttoupper и strparttolower
Данные функции изменяют строчные буквы на заглавные (и наоборот) на отдельных участках строки.
- Добавлены функции countofuppercase и countoflowpercase
Подсчитывают количество заглавных и строчных букв в строке.
- Добавлена функция strtrtrans
Переводит русские символы в транслитерацию.

Обновление 19/10/2016 (версия: 1.1.15):
- Добавлены новые функции в файлы тестов.
- Изменена функция IsPackedString.
- Добавлены новые аргументы функциям: memcmp, find_firs_not_of, find_first_of
- Добавлена поддержка Cririlic (Windows-1251)
- Добавлены новые функции islowerpart, isupperpart
- Добавлен новый псевдо-оператор foreach_string (beta)

Обновление 26/10/2016 (версия 1.1.19):
- Добавлена новая функция strcatex
- Из-за того, что github не поддерживает Windows-1251, было решено перенести все зависимые от кодировки функции в отдельный файл depend_encoding.
- Исправлены некоторые ошибки (errors), предупреждения (warnings), баги.

VVWVV
04.11.2016, 03:11
Обновление 04/11/2016 (Версия 1.1.32):
- Добавлены функции strcatex, strfill, strimplodeex, strimplode, strsplit, replace_sumbol (автор: Deimos).
- Некоторые функции переехали в отдельные файлы.
- Исправлены некоторые ошибки.

Mr_LemoneZ
17.06.2017, 20:43
После подключения данной библиотеки, функция strcmp постоянно возращает ноль, а использование memcmp в OnDialogResponse вызывает ошибку:

[debug] Run time error 5: "Invalid memory access"
[debug] AMX backtrace:
[debug] #0 0000a060 in memcmp (string1[]=@000b6664 "tes", string2[]=@000ba554 "test123", n=204, size_1=51, size_2=51) at C:\Users\LemoneZ\Pawn\Belarus_RolePlay\pawno\include\tdw_string/string.inc:94
[debug] #1 00028518 in public FIXES_OnDialogResponse (... <5 arguments>) at C:\Users\LemoneZ\Pawn\Belarus_RolePlay\gamemodes\brp.pwn:3206
[debug] #2 00008244 in public OnDialogResponse (playerid=0, dialogid=17, response=1, listitem=-1, inputtext[]=@000b6664 "tes") at C:\Users\LemoneZ\Pawn\Belarus_RolePlay\pawno\include\fixes.inc:7982
И возникает она только в том случае, если одна из сравниваемых строк меньше, чем 4 символа. При этом, если у меня будет строка "test123" и в inputtext я запишу "test12", то memcmp сообщит, что строки равны.

VVWVV
18.06.2017, 00:32
После подключения данной библиотеки, функция strcmp постоянно возращает ноль, а использование memcmp в OnDialogResponse вызывает ошибку:

[debug] Run time error 5: "Invalid memory access"
[debug] AMX backtrace:
[debug] #0 0000a060 in memcmp (string1[]=@000b6664 "tes", string2[]=@000ba554 "test123", n=204, size_1=51, size_2=51) at C:\Users\LemoneZ\Pawn\Belarus_RolePlay\pawno\include\tdw_string/string.inc:94
[debug] #1 00028518 in public FIXES_OnDialogResponse (... <5 arguments>) at C:\Users\LemoneZ\Pawn\Belarus_RolePlay\gamemodes\brp.pwn:3206
[debug] #2 00008244 in public OnDialogResponse (playerid=0, dialogid=17, response=1, listitem=-1, inputtext[]=@000b6664 "tes") at C:\Users\LemoneZ\Pawn\Belarus_RolePlay\pawno\include\fixes.inc:7982
И возникает она только в том случае, если одна из сравниваемых строк меньше, чем 4 символа. При этом, если у меня будет строка "test123" и в inputtext я запишу "test12", то memcmp сообщит, что строки равны.

1. Функцию strcmp проверю.
2. При использовании функции memcmp в параметре n стоит значение 204, хотя размер вашей строки 51.

Mr_LemoneZ
18.06.2017, 20:24
2. При использовании функции memcmp в параметре n стоит значение 204, хотя размер вашей строки 51.

Установил в параметре n число 51, теперь ошибки нет, но, как ни странно, memcmp также постоянно возращает ноль (а если одна из строк пустая, то -1).

VVWVV
20.06.2017, 11:19
Версия 4.0.0 (https://github.com/TDW-org/samp-include-string/releases)

1. Изменена структура библиотеки. Теперь все под-библиотеки содержатся в одном файле.
2. Добавлена поддержка JIT-плагина. Для того чтобы включить поддержку, необходимо перед включением библиотеки установить определение TDW_STRING_JIT_COMPAT.
3. Добавлены функции memset, memmove. Функция memcmp была исправлена. Примечание: необходимо с осторожностью использовать данные функции, поскольку они работают с памятью.
4. Добавлена поддержка библиотеки fixes.
5. Исправлены некоторые баги, ошибки. Добавлен специальный тестовый файл, которые содержит основные функции библиотеки.

Спасибо NexiusTailer за исправление бага в ucfirst.

Anve
01.02.2018, 18:49
Посмотрел, нашёл следующую функцию:

stock isnum(const str[])
{
new
i,
temp;

while ((temp = str[i++]) != EOS) {
switch (temp) {
case '0'..'9':
continue;
case '+', '-', '.':
continue;
default:
return 0;
}
}
return 1;
}

Можно сделать проще и быстрее:

stock isnum(const str[])
{
for(new i = 0, temp; (temp = str[i]); i++)
{
switch(temp)
{
case '0'..'9': continue;
case '.','_','+': continue;
default: return 0;
}
}
return 1;
}

StevenH
01.02.2018, 19:08
Посмотрел, нашёл следующую функцию:

stock isnum(const str[])
{
new
i,
temp;

while ((temp = str[i++]) != EOS) {
switch (temp) {
case '0'..'9':
continue;
case '+', '-', '.':
continue;
default:
return 0;
}
}
return 1;
}

Можно сделать проще и быстрее:

stock isnum(const str[])
{
for(new i = 0, temp; (temp = str[i]); i++)
{
switch(temp)
{
case '0'..'9': continue;
case '.','_','+': continue;
default: return 0;
}
}
return 1;
}

На счет быстроты ты уверен?

Anve
01.02.2018, 19:12
На счет быстроты ты уверен?

По твоему стал бы я сюда писать, если бы не проверил?

Geebrox
01.02.2018, 22:11
В обеих кодах не учтено случае, когда передана пустая строка.

Anve
01.02.2018, 22:39
В обеих кодах не учтено случае, когда передана пустая строка.

ам...Тем не менее это не приведёт к какой-либо ошибке, или к выполнению хотя бы одной итерации...Единственное вернёт то, что строка - число, вопрос заключается в том, в каких случаях может быть пустая строка или зачем её передавать намеренно?

Geebrox
02.02.2018, 18:56
ам...Тем не менее это не приведёт к какой-либо ошибке, или к выполнению хотя бы одной итерации...Единственное вернёт то, что строка - число, вопрос заключается в том, в каких случаях может быть пустая строка или зачем её передавать намеренно?

Всякое может случится, или ты считаешь что пустая строка это число?

Anve
03.02.2018, 00:54
Всякое может случится, или ты считаешь что пустая строка это число?

Нет, я просто упоролся.