197d0ea28bed529ef256f5ea6120b6c06531718c
[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);
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, _DEFLT (fp)))
69     {
70       /* Trim trailing newline.  */
71       size_t len = strlen (_DEFLT (buf));
72       if (len && _DEFLT (buf)[len - 1] == '\n')
73         _DEFLT (buf)[len - 1] = '\0';
74
75       /* Eat spaces.  */
76       char *bufp = _DEFLT (buf) - 1;
77       while (*++bufp == ' ') ;
78
79       if ((*strcmpfunc)(bufp, cp, cplen) == 0)
80         {
81           bufp += cplen;
82
83           /* Strip quotes.  */
84           if ((_DEFLT (flags) & DC_STRIP_QUOTES) && *bufp)
85             {
86               /* Strip leading quote.  */
87               if (*bufp == '"' || *bufp == '\'')
88                 {
89                   char *bufp2 = bufp, *bufp3 = bufp;
90                   while ((*bufp2++ = *++bufp3)) ;
91                 }
92
93               /* Strip trailing quote.  */
94               len = strlen (bufp);
95               if (len && (bufp[len - 1] == '"' || bufp[len - 1] == '\''))
96                 bufp[len - 1] = '\0';
97             }
98
99           return bufp;
100         }
101     }
102
103   return NULL;
104 }
105
106
107 int defcntl (int cmd, int newflags)
108 {
109   int oldflags = _DEFLT (flags);
110   switch (cmd)
111     {
112     case DC_GETFLAGS:
113       return oldflags;
114     case DC_SETFLAGS:
115       _DEFLT (flags) = newflags;
116       return oldflags;
117     default:
118       return -1;
119     }
120 }