Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

lib/string: add strnchrnul()

Patch series "lib: rework bitmap_parse", v5.

Similarl to the recently revisited bitmap_parselist(), bitmap_parse() is
ineffective and overcomplicated. This series reworks it, aligns its
interface with bitmap_parselist() and makes it simpler to use.

The series also adds a test for the function and fixes usage of it in
cpumask_parse() according to the new design - drops the calculating of
length of an input string.

bitmap_parse() takes the array of numbers to be put into the map in the BE
order which is reversed to the natural LE order for bitmaps. For example,
to construct bitmap containing a bit on the position 42, we have to put a
line '400,0'. Current implementation reads chunk one by one from the
beginning ('400' before '0') and makes bitmap shift after each successful
parse. It makes the complexity of the whole process as O(n^2). We can do
it in reverse direction ('0' before '400') and avoid shifting, but it
requires reverse parsing helpers.

This patch (of 7):

New function works like strchrnul() with a length limited string.

Link: http://lkml.kernel.org/r/20200102043031.30357-2-yury.norov@gmail.com
Signed-off-by: Yury Norov <yury.norov@gmail.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Rasmus Villemoes <linux@rasmusvillemoes.dk>
Cc: Amritha Nambiar <amritha.nambiar@intel.com>
Cc: Willem de Bruijn <willemb@google.com>
Cc: Kees Cook <keescook@chromium.org>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: "Tobin C . Harding" <tobin@kernel.org>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Miklos Szeredi <mszeredi@redhat.com>
Cc: Vineet Gupta <vineet.gupta1@synopsys.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Steffen Klassert <steffen.klassert@secunet.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Yury Norov and committed by
Linus Torvalds
0bee0cec 97a32539

+18
+1
include/linux/string.h
··· 62 62 #ifndef __HAVE_ARCH_STRCHRNUL 63 63 extern char * strchrnul(const char *,int); 64 64 #endif 65 + extern char * strnchrnul(const char *, size_t, int); 65 66 #ifndef __HAVE_ARCH_STRNCHR 66 67 extern char * strnchr(const char *, size_t, int); 67 68 #endif
+17
lib/string.c
··· 434 434 EXPORT_SYMBOL(strchrnul); 435 435 #endif 436 436 437 + /** 438 + * strnchrnul - Find and return a character in a length limited string, 439 + * or end of string 440 + * @s: The string to be searched 441 + * @count: The number of characters to be searched 442 + * @c: The character to search for 443 + * 444 + * Returns pointer to the first occurrence of 'c' in s. If c is not found, 445 + * then return a pointer to the last character of the string. 446 + */ 447 + char *strnchrnul(const char *s, size_t count, int c) 448 + { 449 + while (count-- && *s && *s != (char)c) 450 + s++; 451 + return (char *)s; 452 + } 453 + 437 454 #ifndef __HAVE_ARCH_STRRCHR 438 455 /** 439 456 * strrchr - Find the last occurrence of a character in a string