Fix remaining copyright headers
[alexxy/gromacs.git] / src / gromacs / gmxlib / strdb.c
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5  * Copyright (c) 2001-2004, The GROMACS development team.
6  * Copyright (c) 2013, by the GROMACS development team, led by
7  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
8  * and including many others, as listed in the AUTHORS file in the
9  * top-level source directory and at http://www.gromacs.org.
10  *
11  * GROMACS is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Lesser General Public License
13  * as published by the Free Software Foundation; either version 2.1
14  * of the License, or (at your option) any later version.
15  *
16  * GROMACS is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  * Lesser General Public License for more details.
20  *
21  * You should have received a copy of the GNU Lesser General Public
22  * License along with GROMACS; if not, see
23  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
24  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
25  *
26  * If you want to redistribute modifications to GROMACS, please
27  * consider that scientific software is very special. Version
28  * control is crucial - bugs must be traceable. We will be happy to
29  * consider code for inclusion in the official distribution, but
30  * derived work must not be called official GROMACS. Details are found
31  * in the README & COPYING files - if they are missing, get the
32  * official version at http://www.gromacs.org.
33  *
34  * To help us fund GROMACS development, we humbly ask that you cite
35  * the research papers on the package. Check out http://www.gromacs.org.
36  */
37 #ifdef HAVE_CONFIG_H
38 #include <config.h>
39 #endif
40
41 #include <stdio.h>
42 #include <stdlib.h>
43 #include "string2.h"
44 #include "gromacs/fileio/futil.h"
45 #include "smalloc.h"
46 #include "gmx_fatal.h"
47 #include "strdb.h"
48
49 gmx_bool get_a_line(FILE *fp, char line[], int n)
50 {
51     char *line0;
52     char *dum;
53
54     snew(line0, n+1);
55
56     do
57     {
58         if (!fgets(line0, n+1, fp))
59         {
60             sfree(line0);
61             return FALSE;
62         }
63         dum = strchr(line0, '\n');
64         if (dum)
65         {
66             dum[0] = '\0';
67         }
68         else if (strlen(line0) == n)
69         {
70             fprintf(stderr, "Warning: line length exceeds buffer length (%d), data might be corrupted\n", n);
71             line0[n-1] = '\0';
72         }
73         else
74         {
75             fprintf(stderr, "Warning: file does not end with a newline, last line:\n%s\n",
76                     line0);
77         }
78         dum = strchr(line0, ';');
79         if (dum)
80         {
81             dum[0] = '\0';
82         }
83         strncpy(line, line0, n);
84         dum = line0;
85         ltrim(dum);
86     }
87     while (dum[0] == '\0');
88
89     sfree(line0);
90     return TRUE;
91 }
92
93 gmx_bool get_header(char line[], char *header)
94 {
95     char temp[STRLEN], *dum;
96
97     strcpy(temp, line);
98     dum = strchr(temp, '[');
99     if (dum == NULL)
100     {
101         return FALSE;
102     }
103     dum[0] = ' ';
104     dum    = strchr(temp, ']');
105     if (dum == NULL)
106     {
107         gmx_fatal(FARGS, "header is not terminated on line:\n'%s'\n", line);
108         return FALSE;
109     }
110     dum[0] = '\0';
111     if (sscanf(temp, "%s%*s", header) != 1)
112     {
113         return FALSE;
114     }
115
116     return TRUE;
117 }
118
119 int get_strings(const char *db, char ***strings)
120 {
121     FILE  *in;
122     char **ptr;
123     char   buf[256];
124     int    i, nstr;
125
126     in = libopen(db);
127
128     if (fscanf(in, "%d", &nstr) != 1)
129     {
130         gmx_warning("File %s is empty", db);
131         ffclose(in);
132         return 0;
133     }
134     snew(ptr, nstr);
135     for (i = 0; (i < nstr); i++)
136     {
137         if (1 != fscanf(in, "%s", buf))
138         {
139             gmx_fatal(FARGS, "Cannot read string from buffer");
140         }
141 #ifdef DEBUG
142         fprintf(stderr, "Have read: %s\n", buf);
143 #endif
144         ptr[i] = strdup(buf);
145     }
146     ffclose(in);
147
148     *strings = ptr;
149
150     return nstr;
151 }
152
153 int search_str(int nstr, char **str, char *key)
154 {
155     int i;
156
157     /* Linear search */
158     for (i = 0; (i < nstr); i++)
159     {
160         if (gmx_strcasecmp(str[i], key) == 0)
161         {
162             return i;
163         }
164     }
165
166     return -1;
167 }
168
169 int fget_lines(FILE *in, char ***strings)
170 {
171     char **ptr;
172     char   buf[STRLEN];
173     int    i, nstr;
174     char  *pret;
175
176     pret = fgets(buf, STRLEN-1, in);
177     if (pret == NULL  || sscanf(buf, "%d", &nstr) != 1)
178     {
179         gmx_warning("File is empty");
180         ffclose(in);
181
182         return 0;
183     }
184     snew(ptr, nstr);
185     for (i = 0; (i < nstr); i++)
186     {
187         fgets2(buf, STRLEN-1, in);
188         ptr[i] = gmx_strdup(buf);
189     }
190
191     (*strings) = ptr;
192
193     return nstr;
194 }
195
196 int get_lines(const char *db, char ***strings)
197 {
198     FILE *in;
199     int   nstr;
200
201     in   = libopen(db);
202     nstr = fget_lines(in, strings);
203     ffclose(in);
204
205     return nstr;
206 }
207
208 int get_file(const char *db, char ***strings)
209 {
210     FILE  *in;
211     char **ptr = NULL;
212     char   buf[STRLEN];
213     int    i, nstr, maxi;
214
215     in = libopen(db);
216
217     i = maxi = 0;
218     while (fgets2(buf, STRLEN-1, in))
219     {
220         if (i >= maxi)
221         {
222             maxi += 50;
223             srenew(ptr, maxi);
224         }
225         ptr[i] = strdup(buf);
226         i++;
227     }
228     nstr = i;
229     ffclose(in);
230     srenew(ptr, nstr);
231     *strings = ptr;
232
233     return nstr;
234 }