lib/: Call strchrnul(3) instead of open-coding it

Performance tests made in 2007 are obsolete.  We should assume libc is
reasonably fast today (otherwise, report a bug to libc).

$ git blame -- lib/sgetgrent.c | grep strchr
45c6603cc (nekral-guest      2007-10-07 11:44:02 +0000  30)  *	WARNING: I profiled this once with and without strchr() calls
6f88bcf58 (nekral-guest      2008-05-26 08:31:14 +0000  97) 		cp = strchr (cp, ':');

Signed-off-by: Alejandro Colomar <alx@kernel.org>
This commit is contained in:
Alejandro Colomar
2024-01-15 16:20:03 +01:00
committed by Serge Hallyn
parent bed18501b1
commit 5f8f19f267
4 changed files with 24 additions and 22 deletions
+4 -8
View File
@@ -14,6 +14,7 @@
#include <stdio.h>
#include <sys/types.h>
#include <grp.h>
#include <string.h>
#include "alloc.h"
#include "defines.h"
@@ -27,14 +28,11 @@
* list() converts the comma-separated list of member names into
* an array of character pointers.
*
* WARNING: I profiled this once with and without strchr() calls
* and found that using a register variable and an explicit loop
* works best. For large /etc/group files, this is a major win.
*
* FINALLY added dynamic allocation. Still need to fix sgetsgent().
* --marekm
*/
static char **list (char *s)
static char **
list(char *s)
{
static char **members = NULL;
static size_t size = 0; /* max members + 1 */
@@ -55,9 +53,7 @@ static char **list (char *s)
if (!s || s[0] == '\0')
break;
members[i++] = s;
while (('\0' != *s) && (',' != *s)) {
s++;
}
s = strchrnul(s, ',');
if ('\0' != *s) {
*s++ = '\0';
}
+6 -5
View File
@@ -12,9 +12,11 @@
#ident "$Id$"
#include <sys/types.h>
#include "defines.h"
#include <stdio.h>
#include <pwd.h>
#include <string.h>
#include "defines.h"
#include "prototypes.h"
#include "shadowlog_internal.h"
@@ -32,7 +34,8 @@
* performance reasons. I am going to come up with some conditional
* compilation glarp to improve on this in the future.
*/
struct passwd *sgetpwent (const char *buf)
struct passwd *
sgetpwent(const char *buf)
{
static struct passwd pwent;
static char pwdbuf[PASSWD_ENTRY_MAX_LENGTH];
@@ -60,9 +63,7 @@ struct passwd *sgetpwent (const char *buf)
for (cp = pwdbuf, i = 0; (i < NFIELDS) && (NULL != cp); i++) {
fields[i] = cp;
while (('\0' != *cp) && (':' != *cp)) {
cp++;
}
cp = strchrnul(cp, ':');
if ('\0' != *cp) {
*cp = '\0';
+10 -5
View File
@@ -14,17 +14,24 @@
#ident "$Id$"
#include <stdio.h>
#include <sys/types.h>
#include <string.h>
#include "prototypes.h"
#include "shadowlog_internal.h"
#include "defines.h"
#include <stdio.h>
#define FIELDS 9
#define OFIELDS 5
/*
* sgetspent - convert string in shadow file format to (struct spwd *)
*/
struct spwd *sgetspent (const char *string)
struct spwd *
sgetspent(const char *string)
{
static char spwbuf[PASSWD_ENTRY_MAX_LENGTH];
static struct spwd spwd;
@@ -57,9 +64,7 @@ struct spwd *sgetspent (const char *string)
for (cp = spwbuf, i = 0; ('\0' != *cp) && (i < FIELDS); i++) {
fields[i] = cp;
while (('\0' != *cp) && (':' != *cp)) {
cp++;
}
cp = strchrnul(cp, ':');
if ('\0' != *cp) {
*cp = '\0';
+4 -4
View File
@@ -16,6 +16,7 @@
#include <pwd.h>
#include <ctype.h>
#include <fcntl.h>
#include <string.h>
#include "alloc.h"
#include "string/sprintf.h"
@@ -74,7 +75,8 @@ subordinate_free(/*@only@*/void *ent)
* in @line, or NULL on failure. Note that the returned value should not
* be freed by the caller.
*/
static void *subordinate_parse (const char *line)
static void *
subordinate_parse(const char *line)
{
static struct subordinate_range range;
static char rangebuf[1024];
@@ -97,9 +99,7 @@ static void *subordinate_parse (const char *line)
for (cp = rangebuf, i = 0; (i < SUBID_NFIELDS) && (NULL != cp); i++) {
fields[i] = cp;
while (('\0' != *cp) && (':' != *cp)) {
cp++;
}
cp = strchrnul(cp, ':');
if ('\0' != *cp) {
*cp = '\0';