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>
#include <stdio.h>
#include <sys/types.h>
#include <grp.h>
+#include <string.h>
#include "alloc.h"
#include "defines.h"
* 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 */
if (!s || s[0] == '\0')
break;
members[i++] = s;
- while (('\0' != *s) && (',' != *s)) {
- s++;
- }
+ s = strchrnul(s, ',');
if ('\0' != *s) {
*s++ = '\0';
}
#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"
* 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];
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';
#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;
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';
#include <pwd.h>
#include <ctype.h>
#include <fcntl.h>
+#include <string.h>
#include "alloc.h"
#include "string/sprintf.h"
* 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];
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';