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 strchr45c6603cc(nekral-guest 2007-10-07 11:44:02 +0000 30) * WARNING: I profiled this once with and without strchr() calls6f88bcf58(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:
committed by
Serge Hallyn
parent
bed18501b1
commit
5f8f19f267
+4
-8
@@ -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
@@ -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
@@ -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
@@ -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';
|
||||
|
||||
Reference in New Issue
Block a user