Что-то не соображу как проще всего найти строку в блоке памяти (char*).
strstr не подходит поскольку блок не единая строка и не нуль-терминированный (известен размер).
Пока сделал на memchr + memcmp, ничего похожего на memstr что-то не нагугливавется. Может быть хотя бы под Windows есть что-нибудь?
Здравствуйте, zaichatki, Вы писали:
Z>Здравствуйте,
Z>Что-то не соображу как проще всего найти строку в блоке памяти (char*). Z>strstr не подходит поскольку блок не единая строка и не нуль-терминированный (известен размер). Z>Пока сделал на memchr + memcmp, ничего похожего на memstr что-то не нагугливавется. Может быть хотя бы под Windows есть что-нибудь?
Здравствуйте, zaichatki, Вы писали:
Z>Здравствуйте,
Z>Что-то не соображу как проще всего найти строку в блоке памяти (char*). Z>strstr не подходит поскольку блок не единая строка и не нуль-терминированный (известен размер). Z>Пока сделал на memchr + memcmp, ничего похожего на memstr что-то не нагугливавется. Может быть хотя бы под Windows есть что-нибудь?
Здравствуйте, zaichatki, Вы писали:
Z>Здравствуйте,
Z>Что-то не соображу как проще всего найти строку в блоке памяти (char*). Z>strstr не подходит поскольку блок не единая строка и не нуль-терминированный (известен размер). Z>Пока сделал на memchr + memcmp, ничего похожего на memstr что-то не нагугливавется. Может быть хотя бы под Windows есть что-нибудь?
возьмите код для strstr, уберите там проверки ноль символа и дополните параметрами размеров блоков
DESCRIPTION
The memmem() function finds the start of the first occurrence of the substring needle of length needlelen in the memory area
haystack of length haystacklen.
RETURN VALUE
The memmem() function returns a pointer to the beginning of the substring, or NULL if the substring is not found.
Здравствуйте, zaichatki, Вы писали:
Z>Здравствуйте, zaufi, Вы писали:
Z>>потому что она называется memmem()
Z>Да, ступил. Жаль под вин нет. С другой стороны, реализация там довольно прямолинейная. У меня сейчас практически также, только вместо цикла memchr.
Здравствуйте, zaichatki, Вы писали:
Z>Здравствуйте, zaufi, Вы писали:
Z>>ну если хочется сложностей смотри сюда %)
Z>Я наоборот перестал расстраиваться что у меня всё так просто раз уж в линуксовых либах также.
посмотрел в исходники glibc 2.13-r4 (моя текущая), и боюсь разочарую тебя, но там все уже далеко не так просто
/* We use the Two-Way string matching algorithm, which guarantees
linear complexity with constant space. Additionally, for long
needles, we also use a bad character shift table similar to the
Boyer-Moore algorithm to achieve improved (potentially sub-linear)
performance.
Здравствуйте, zaichatki, Вы писали:
Z>Что-то не соображу как проще всего найти строку в блоке памяти (char*). Z>strstr не подходит поскольку блок не единая строка и не нуль-терминированный (известен размер). Z>Пока сделал на memchr + memcmp, ничего похожего на memstr что-то не нагугливавется. Может быть хотя бы под Windows есть что-нибудь?
/*
Binary data search using Boyer-Moore algorithm, modified by R. Nigel Horspool
see:
http://www-igm.univ-mlv.fr/~lecroq/string/node18.html
SYNOPSIS:
where - source data, src_length - source data byte length (bytes)
what - data to be sought, what_length - sought data length (bytes)
RETURNS:
address of 'what' data in 'where' block or 0 if not found.
c adjustment was made by: andrew at terrainformatica.com
*/const void *mem_lookup(const void *where, size_t where_length, const void *what, size_t what_length )
{
#define WHAT ((const byte*)what)
int m1 = int(what_length) - 1;
/* Preprocessing */int i,bm_bc[ 256 ];
for ( i = 0; i < 256; i++ ) bm_bc[i] = int(what_length);
for ( i = 0; i < m1; i++ ) bm_bc[ WHAT[i] ] = m1 - i;
/* Searching */
byte b, lastb = WHAT[ m1 ];
const byte *p = (const byte *)where;
const byte *end = p + where_length - what_length;
for(; p <= end; p += bm_bc[ b ] )
{
b = p[ m1 ];
if ( (b == lastb) && ( memcmp( p, what, m1 ) == 0 ) )
return p;
}
#undef WHAT
return 0;
}