Update copyright statements and change license to LGPL
[alexxy/gromacs.git] / src / gmxlib / ffscanf.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  * check out http://www.gromacs.org for more information.
7  * Copyright (c) 2012, by the GROMACS development team, led by
8  * David van der Spoel, Berk Hess, Erik Lindahl, and including many
9  * others, as listed in the AUTHORS file in the top-level source
10  * directory and at http://www.gromacs.org.
11  *
12  * GROMACS is free software; you can redistribute it and/or
13  * modify it under the terms of the GNU Lesser General Public License
14  * as published by the Free Software Foundation; either version 2.1
15  * of the License, or (at your option) any later version.
16  *
17  * GROMACS is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20  * Lesser General Public License for more details.
21  *
22  * You should have received a copy of the GNU Lesser General Public
23  * License along with GROMACS; if not, see
24  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
25  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
26  *
27  * If you want to redistribute modifications to GROMACS, please
28  * consider that scientific software is very special. Version
29  * control is crucial - bugs must be traceable. We will be happy to
30  * consider code for inclusion in the official distribution, but
31  * derived work must not be called official GROMACS. Details are found
32  * in the README & COPYING files - if they are missing, get the
33  * official version at http://www.gromacs.org.
34  *
35  * To help us fund GROMACS development, we humbly ask that you cite
36  * the research papers on the package. Check out http://www.gromacs.org.
37  */
38 #ifdef HAVE_CONFIG_H
39 #include <config.h>
40 #endif
41
42 /* This file is completely threadsafe - keep it that way! */
43
44
45 #include <stdarg.h>
46 #include <ctype.h>
47 #include "typedefs.h"
48 #include "string2.h"
49 #include "gmx_fatal.h"
50 #include "ffscanf.h"
51
52 static int getfld(char **p)
53 {
54   int fld;
55   
56   fld=0;
57   while (isdigit(**p)) fld=(fld*10)+((*((*p)++))-'0');
58   return fld;
59 }
60
61 void ffscanf(FILE *in,char *fmt, ...)
62 {
63   va_list ap;
64   char *p;
65   char buf[STRLEN];
66   int i,fld;
67   double dval;
68
69   va_start(ap,fmt);
70   for (p=fmt; *p; p++) {
71     if (*p == '%') {
72       p++;
73       fld=getfld(&p);
74       for(i=0; (i<fld); ) {
75         buf[i]=fgetc(in);
76         if (buf[i] != '\n') i++;
77       }
78       buf[fld]='\0';
79       switch(*p) {
80       case 'd':
81         sscanf(buf,"%d",va_arg(ap,int *));
82         break;
83       case 'f':
84         sscanf(buf,"%f",va_arg(ap,float *));
85         break;
86       case 'F':
87         sscanf(buf,"%lf",va_arg(ap,double *));
88         break;
89       case 'r':
90         sscanf(buf,"%lf",&dval);
91         *(va_arg(ap,real *)) = dval;
92         break;
93       default:
94         break;
95       }
96     }
97     else
98       gmx_fatal(FARGS,"unknown ffscanf format '%c'",*p+1);
99   }
100   va_end(ap);
101 }
102