Lots of magic
[kopensolaris-gnu/glibc.git] / sysdeps / unix / sysv / solaris2 / kopensolaris-gnu / deflt.c
1 /* Copyright (C) 2008 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 #include <defltP.h>
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24
25 /* XXX: OpenSolaris uses a per-thread buffer.  */
26
27 _DEFLT_INIT
28
29 int defopen (char *fn)
30 {
31   /* Close old file if open.  */
32   if (_DEFLT (fp))
33     fclose (_DEFLT (fp));
34   if (fn == NULL)
35     return 0;
36
37   _DEFLT (fp) = fopen (fn, "r");
38   if (!_DEFLT (fp))
39     return -1;
40
41   /* Allocate line buffer.  */
42   if (_DEFLT (buf) == NULL)
43     {
44       _DEFLT (buf) = malloc (_DEFLT_BUFSIZE + 2);
45       if (!_DEFLT (buf))
46         return -1;
47     }
48
49   /* Set default flags.  */
50   _DEFLT (flags) = DC_STD;
51
52   return 0;
53 }
54
55
56 char * defread (char *cp)
57 {
58   if (_DEFLT (fp) == NULL)
59       return NULL;
60
61   /* Rewind if needed.  */
62   if ((_DEFLT (flags) & DC_NOREWIND) == 0)
63     rewind (_DEFLT (fp));
64
65   size_t cplen = strlen (cp);
66   int (*strcmpfunc)(const char *, const char *, size_t) =
67       (_DEFLT (flags) & DC_CASE) ? strncmp : strncasecmp;
68   while (fgets (_DEFLT (buf), _DEFLT_BUFSIZE + 2, _DEFLT (fp)))
69     {
70       if (strlen (_DEFLT (buf)) > _DEFLT_BUFSIZE)
71         break;
72
73       /* Trim trailing newline.  */
74       size_t len = strlen (_DEFLT (buf));
75       if (len && _DEFLT (buf)[len - 1] == '\n')
76         _DEFLT (buf)[len - 1] = '\0';
77
78       /* Eat spaces.  */
79       char *bufp = _DEFLT (buf) - 1;
80       while (*++bufp == ' ') ;
81
82       if ((*strcmpfunc)(bufp, cp, cplen) == 0)
83         {
84           bufp += cplen;
85
86           /* Strip quotes.  */
87           if ((_DEFLT (flags) & DC_STRIP_QUOTES) && *bufp)
88             {
89               /* Strip leading quote.  */
90               if (*bufp == '"' || *bufp == '\'')
91                 {
92                   char *bufp2 = bufp, *bufp3 = bufp;
93                   while ((*bufp2++ = *++bufp3)) ;
94                 }
95
96               /* Strip trailing quote.  */
97               len = strlen (bufp);
98               if (len && (bufp[len - 1] == '"' || bufp[len - 1] == '\''))
99                 bufp[len - 1] = '\0';
100             }
101
102           return bufp;
103         }
104     }
105
106   return NULL;
107 }
108
109
110 int defcntl (int cmd, int newflags)
111 {
112   int oldflags = _DEFLT (flags);
113   switch (cmd)
114     {
115     case DC_GETFLAGS:
116       return oldflags;
117     case DC_SETFLAGS:
118       _DEFLT (flags) = newflags;
119       return oldflags;
120     default:
121       return -1;
122     }
123 }