Do network lookups ignoring case.
[kopensolaris-gnu/glibc.git] / nss / nss_files / files-parse.c
index ece253d..76df1c6 100644 (file)
@@ -1,21 +1,21 @@
 /* Common code for file-based database parsers in nss_files module.
-Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
+   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
 
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
 
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
 
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA.  */
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #include <ctype.h>
 #include <errno.h>
@@ -39,7 +39,7 @@ Cambridge, MA 02139, USA.  */
 #define CONCAT1(a,b) a##b
 
 #ifndef STRUCTURE
-#define STRUCTURE ENTNAME
+# define STRUCTURE ENTNAME
 #endif
 
 
@@ -47,9 +47,9 @@ struct parser_data
   {
 #ifdef ENTDATA
     struct ENTDATA entdata;
-#define ENTDATA_DECL(data) struct ENTDATA *const entdata = &data->entdata;
+# define ENTDATA_DECL(data) struct ENTDATA *const entdata = &data->entdata;
 #else
-#define ENTDATA_DECL(data)
+# define ENTDATA_DECL(data)
 #endif
     char linebuffer[0];
   };
@@ -57,11 +57,11 @@ struct parser_data
 #ifdef ENTDATA
 /* The function can't be exported, because the entdata structure
    is defined only in files-foo.c.  */
-#define parser_stclass static inline
+# define parser_stclass static inline
 #else
 /* Export the line parser function so it can be used in nss_db.  */
-#define parser_stclass /* Global */
-#define parse_line CONCAT(_nss_files_parse_,ENTNAME)
+# define parser_stclass /* Global */
+# define parse_line CONCAT(_nss_files_parse_,ENTNAME)
 #endif
 
 
@@ -69,22 +69,22 @@ struct parser_data
 
 /* The parser is defined in a different module.  */
 extern int parse_line (char *line, struct STRUCTURE *result,
-                      struct parser_data *data, int datalen);
+                      struct parser_data *data, size_t datalen, int *errnop);
 
-#define LINE_PARSER(EOLSET, BODY) /* Do nothing */
+# define LINE_PARSER(EOLSET, BODY) /* Do nothing */
 
 #else
 
 /* Define a line parsing function.  */
 
-#define LINE_PARSER(EOLSET, BODY)                                            \
+# define LINE_PARSER(EOLSET, BODY)                                           \
 parser_stclass int                                                           \
 parse_line (char *line, struct STRUCTURE *result,                            \
-           struct parser_data *data, int datalen)                            \
+           struct parser_data *data, size_t datalen, int *errnop)            \
 {                                                                            \
   ENTDATA_DECL (data)                                                        \
   char *p = strpbrk (line, EOLSET "\n");                                     \
-  if (p)                                                                     \
+  if (p != NULL)                                                             \
     *p = '\0';                                                               \
   BODY;                                                                              \
   TRAILING_LIST_PARSER;                                                              \
@@ -92,7 +92,7 @@ parse_line (char *line, struct STRUCTURE *result,                           \
 }
 
 
-#define STRING_FIELD(variable, terminator_p, swallow)                        \
+# define STRING_FIELD(variable, terminator_p, swallow)                       \
   {                                                                          \
     variable = line;                                                         \
     while (*line != '\0' && !terminator_p (*line))                           \
@@ -106,7 +106,7 @@ parse_line (char *line, struct STRUCTURE *result,                         \
       }                                                                              \
   }
 
-#define INT_FIELD(variable, terminator_p, swallow, base, convert)            \
+# define INT_FIELD(variable, terminator_p, swallow, base, convert)           \
   {                                                                          \
     char *endp;                                                                      \
     variable = convert (strtol (line, &endp, base));                         \
@@ -121,7 +121,7 @@ parse_line (char *line, struct STRUCTURE *result,                         \
     line = endp;                                                             \
   }
 
-#define INT_FIELD_MAYBE_NULL(variable, terminator_p, swallow, base, convert, default)        \
+# define INT_FIELD_MAYBE_NULL(variable, terminator_p, swallow, base, convert, default)       \
   {                                                                          \
     char *endp;                                                                      \
     if (*line == '\0')                                                       \
@@ -139,24 +139,24 @@ parse_line (char *line, struct STRUCTURE *result,                       \
     line = endp;                                                             \
   }
 
-#define ISCOLON(c) ((c) == ':')
+# define ISCOLON(c) ((c) == ':')
 
 
-#ifndef TRAILING_LIST_MEMBER
-#define TRAILING_LIST_PARSER /* Nothing to do.  */
-#else
+# ifndef TRAILING_LIST_MEMBER
+#  define TRAILING_LIST_PARSER /* Nothing to do.  */
+# else
 
-#define TRAILING_LIST_PARSER                                                 \
+#  define TRAILING_LIST_PARSER                                               \
 {                                                                            \
-  char **list = parse_list (line, data, datalen);                            \
+  char **list = parse_list (line, data, datalen, errnop);                    \
   if (list)                                                                  \
     result->TRAILING_LIST_MEMBER = list;                                     \
   else                                                                               \
-    return 0;                                                                \
+    return -1;         /* -1 indicates we ran out of space.  */              \
 }
 
 static inline char **
-parse_list (char *line, struct parser_data *data, int datalen)
+parse_list (char *line, struct parser_data *data, size_t datalen, int *errnop)
 {
   char *eol, **list, **p;
 
@@ -180,38 +180,35 @@ parse_list (char *line, struct parser_data *data, int datalen)
     {
       char *elt;
 
-      if ((char *) &p[1] - (char *) data > datalen)
+      if ((size_t) ((char *) &p[1] - (char *) data) > datalen)
        {
          /* We cannot fit another pointer in the buffer.  */
-         errno = ERANGE;
+         *errnop = ERANGE;
          return NULL;
        }
       if (*line == '\0')
        break;
 
+      /* Skip leading white space.  This might not be portable but useful.  */
+      while (isspace (*line))
+       ++line;
+
       elt = line;
       while (1)
        {
-         if (TRAILING_LIST_SEPARATOR_P (*line))
-           {
-             *p++ = elt;
-             *line = '\0';
-             do
-               ++line;
-             while (TRAILING_LIST_SEPARATOR_P (*line));
-             elt = line;
-           }
-         else if (*line == '\0' || *line == '\n')
+         if (*line == '\0' || TRAILING_LIST_SEPARATOR_P (*line))
            {
-             /* End of the line.  */
+             /* End of the next entry.  */
              if (line > elt)
-               /* Last element.  */
+               /* We really found some data.  */
                *p++ = elt;
-             *line = '\0';
+
+             /* Terminate string if necessary.  */
+             if (*line != '\0')
+               *line++ = '\0';
              break;
            }
-         else
-           ++line;
+         ++line;
        }
     }
   *p = NULL;
@@ -219,6 +216,7 @@ parse_list (char *line, struct parser_data *data, int datalen)
   return list;
 }
 
+# endif        /* TRAILING_LIST_MEMBER */
 #endif /* EXTERN_PARSER */
 
 
@@ -234,9 +232,8 @@ parse_list (char *line, struct parser_data *data, int datalen)
     break;                                                                   \
 }
 
-#endif
 
 /* This is defined by db-*.c to include "../nss_db/db-XXX.c" instead.  */
 #ifndef GENERIC
-#define GENERIC "files-XXX.c"
+# define GENERIC "files-XXX.c"
 #endif