Манипуляции со строками
Немного сахара на тему манипуляций со строками:
# Замена стандартной substr. Третий параметр по умолчанию 1
define(`Substr',`substr(`$1',`$2',m4_default(`$3',1))')
# Замена стандартной find. Если пропущен второй аргумент, # то вместо него подставляется 0 и поиск идет по всей строке
define(`Find',`ifelse(`$#',2,find(`$1',0,`$2'),find(`$*'))')
# --------------------------------------------------
# Возвращает -1, если значение отсутствует в списке, иначе - присутствует
# Упрощённый вариант функции Find_In_List
# FUNC Exists_In_List(list,str)
# result = Find("," & list & ",",str)
# END FUNC
#
define(`Exists_In_List',`ifelse($#,2,Find("`,'"&`$1'& "`,'","`,'"&`$2'&"`,'"),m4_error(`Illegal number of parameters `$0''))')
# -------------------------------------------------- # Возвращает всю правую часть строки, начиная с символа c порядковым номером START
# FUNC Str_Right(str,start)
# result = substr(str,start,len(str)-start)
# END FUNC
#
define(`Str_Right',`ifelse($#,2,substr(`$1',`$2',len(`$1')-m4_arg(`$2')),m4_error(`Illegal number of parameters `$0''))')
# -------------------------------------------------- # Возвращает правую часть строки длиной N символов
# FUNC Str_RightSymbols(str,N)
# result = substr(str,len(str)-N,N)
# END FUNC
#
define(`Str_RightSymbols',`ifelse($#,2,substr(`$1',len(`$1')-m4_arg(`$2'),m4_arg(`$2')),m4_error(`Illegal number of parameters `$0''))')
# --------------------------------------------------- # Возвращает левую часть строки. Количество символов по умолчанию - 1
# Str_Left(Str,N)
define(`Str_Left',`substr(`$1',0,m4_default(`$2',1))')
# --------------------------------------------------- # Убирает из строки N правых символов. По умолчанию отрезается 1 символ
# Str_Cut_Right(Str,N)
define(`Str_Cut_Right',`Str_Left(`$1',len(`$1') -m4_arg(m4_default(`$2',1)))')
# --------------------------------------------------- # Убирает из строки N левых символов. По умолчанию отрезается 1 символ
# Str_Cut_Left(Str,N)
define(`Str_Cut_Left',`Str_Right(`$1',m4_default(`$2',1))')
# --------------------------------------------------- # Возвращает часть строки между двумя номерами символов включительно
# Str_Between(Str,Pos1,Pos2)
define(`Str_Between',`substr(`$1',`$2',m4_arg(`$3')-m4_arg(`$2')+1)')
# --------------------------------------------------- # Замена подстроки, начинающейся со Start позиции и длиной N символов на строку Replace
# Если пропущен третий аргумент, он считается равным 1. Если пропущен 4й аргумент, происходит вставка пустой строки
# Str_Replace(Str,Start,Length,Replace)
define(`Str_Replace',`Str_Left(`$1',m4_default(`$2',0)) & ifelse(`$4',,,`$4',"",,m4_arg(`$4') &) Str_Right(`$1',m4_default(m4_arg(`$2'),0)+m4_default(m4_arg(`$3'),1))')
# --------------------------------------------------- # Удаление символов из строки. Удаляется Length символов, начиная с позиции с Pos. По умолчанию удаляется 1 символ
# Str_Delete(Str,Pos,Length)
define(`Str_Delete',`Str_Replace(`$1',`$2',`$3')')