ОБЗОР
#define _GNU_SOURCE /* см. feature_test_macros(7) */
#include <string.h>
int strverscmp(const char *s1, const char *s2);
ОПИСАНИЕ
Часто имеются файлы jan1, jan2, ..., jan9, jan10, … и при выводе списка командой ls(1) они выводятся как jan1, jan10, ..., jan2, …, jan9, что несколько не то, что хотелось бы. Чтобы исправить это, в GNU добавлен аргумент командной строки -v команды ls(1), который реализован через функцию versionsort(3), которая, в свою очередь, использует функцию strverscmp().Таким образом, задача функции strverscmp() в том, чтобы сравнить две строки и найти «правильную» очередность, в то время как strcmp(3) обнаруживает только лексикографический порядок. Эта функция не использует категорию локали LC_COLLATE, что, в общем случае, означает, что строки должны быть в кодировке ASCII.
Функция делает следующее. Если обе строки равны, то возвращается 0. Иначе находится позиция между двумя байтами в обеих строках, до которой строки равны, а после которой не равны. Далее находятся наибольшие последовательные строки цифр, содержащие (или начинающиеся, или заканчивающиеся) эту позицию. Если такие последовательности не найдены в обеих строках, то возвращается такой же результат, какой вернула бы функция strcmp(3) (численная сортировка по значениям байтов). В противном случае обе строки цифр сравниваются численно. При этом строки, начинающиеся с одного или более нулей рассматриваются таким образом, как если бы перед ними стояла десятичная запятая (то есть строки цифр начинающиеся с большего количества нулей, будут идти перед строками с меньшим количеством). Пример: 000, 00, 01, 010, 09, 0, 1, 9, 10.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция strverscmp() возвращает целое число меньшее, равное или большее нуля, если, соответственно, s1 должно идти раньше, на том же месте, или позже s2.АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).Интерфейс | Атрибут | Значение |
strverscmp() | безвредность в нитях | безвредно (MT-Safe) |