Mon Jul 1 12:29:50 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
authorroland <roland>
Mon, 1 Jul 1996 22:16:28 +0000 (22:16 +0000)
committerroland <roland>
Mon, 1 Jul 1996 22:16:28 +0000 (22:16 +0000)
* nss/nss_files/files-parse.c (parse_list): Correct alignment fixup.
Fri Jun 28 07:27:10 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>

* nss/nss_files/files-hosts.c (ENTDATA): Define it.
* nss/nss_files/files-parse.c (struct parser_data): Define entdata
member only #ifdef ENTDATA.
(ENTDATA_DECL): New macro.
(LINE_PARSER): Use it for entdata decl.
(parse_list): Find the space for LIST from DATA->linebuffer instead of
from the input LINE, which might not be writable buffer space.
(LINE_PARSER): Use `parser_stclass' in place of `static inline'.
[ENTDATA] (parser_stclass): #define to `static inline'.
[!ENDATA] (parser_stclass): #define to empty.
[!ENDATA] (parse_line): #define to _nss_files_parse_ENTNAME; the
function is exported to -lnss_files users.

nss/nss_files/files-parse.c

index de45699..be35ae1 100644 (file)
@@ -33,17 +33,31 @@ Cambridge, MA 02139, USA.  */
 
 struct parser_data
   {
-    struct CONCAT(ENTNAME,_data) entdata;
+#ifdef ENTDATA
+    struct ENTDATA entdata;
+#define ENTDATA_DECL(data) struct ENTDATA *const entdata = &data->entdata
+#else
+#define ENTDATA_DECL(data)
+#endif
     char linebuffer[0];
   };
 
+#ifdef ENTDATA
+/* The function can't be exported, because the entdata structure
+   is defined only in files-foo.c.  */
+#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)
+#endif
+
 #define LINE_PARSER(BODY)                                                    \
-static inline int                                                            \
+parser_stclass int                                                           \
 parse_line (char *line, struct STRUCTURE *result,                            \
            struct parser_data *data, int datalen)                            \
 {                                                                            \
-  struct CONCAT(ENTNAME,_data) *const entdata __attribute__ ((unused))       \
-    = &data->entdata;                                                        \
+  ENTDATA_DECL (data);                                                       \
   BODY;                                                                              \
   TRAILING_LIST_PARSER;                                                              \
   return 1;                                                                  \
@@ -107,9 +121,10 @@ parse_list (char *line, struct parser_data *data, int datalen)
   char *eol, **list, **p;
 
   /* Find the end of the line buffer.  */
-  eol = strchr (line, '\0') + 1;
+  eol = strchr (data->linebuffer, '\0') + 1;
   /* Adjust the pointer so it is aligned for storing pointers.  */
-  eol += (eol - (char *) 0) % __alignof__ (char *);
+  eol += __alignof__ (char *) - 1;
+  eol -= (eol - (char *) 0) % __alignof__ (char *);
   /* We will start the storage here for the vector of pointers.  */
   list = (char **) eol;