2 * This file is part of the GROMACS molecular simulation package.
4 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5 * Copyright (c) 2001-2004, The GROMACS development team.
6 * Copyright (c) 2013,2014, 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.
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.
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.
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.
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.
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.
49 #include "gromacs/utility/fatalerror.h"
51 #include "gromacs/utility/smalloc.h"
52 #include "gromacs/utility/futil.h"
54 #include "gromacs/utility/cstringutil.h"
58 #include "gmxfio_int.h"
61 /* This is the part that reads dummy and ascii files. */
66 /* file type functions */
67 static gmx_bool
do_ascread(t_fileio
*fio
, void *item
, int nitem
, int eio
,
68 const char *desc
, const char *srcfile
, int line
);
69 static gmx_bool
do_ascwrite(t_fileio
*fio
, const void *item
, int nitem
, int eio
,
70 const char *desc
, const char *srcfile
, int line
);
71 static gmx_bool
do_dummyread(t_fileio
*fio
, void *item
, int nitem
, int eio
,
72 const char *desc
, const char *srcfile
, int line
);
73 static gmx_bool
do_dummywrite(t_fileio
*fio
, const void *item
, int nitem
, int eio
,
74 const char *desc
, const char *srcfile
, int line
);
77 const t_iotype asc_iotype
= {do_ascread
, do_ascwrite
};
78 const t_iotype dummy_iotype
= {do_dummyread
, do_dummywrite
};
85 static gmx_bool
do_dummyread(t_fileio gmx_unused
*fio
, void gmx_unused
*item
, int gmx_unused nitem
, int gmx_unused eio
,
86 const char gmx_unused
*desc
, const char gmx_unused
*srcfile
, int gmx_unused line
)
88 gmx_fatal(FARGS
, "File type not set!");
92 static gmx_bool
do_dummywrite(t_fileio gmx_unused
*fio
, const void gmx_unused
*item
, int gmx_unused nitem
, int gmx_unused eio
,
93 const char gmx_unused
*desc
, const char gmx_unused
*srcfile
, int gmx_unused line
)
95 gmx_fatal(FARGS
, "File type not set!");
101 static void encode_string(int maxlen
, char dst
[], const char src
[])
105 for (i
= 0; (i
< maxlen
- 1) && (src
[i
] != '\0'); i
++)
107 if ((src
[i
] == ' ') || (src
[i
] == '\t'))
120 fprintf(stderr
, "String '%s' truncated to '%s'\n", src
, dst
);
124 static void decode_string(int maxlen
, char dst
[], const char src
[])
128 for (i
= 0; (i
< maxlen
- 1) && (src
[i
] != '\0'); i
++)
143 fprintf(stderr
, "String '%s' truncated to '%s'\n", src
, dst
);
147 static gmx_bool
do_ascwrite(t_fileio
*fio
, const void *item
, int nitem
, int eio
,
148 const char *desc
, const char *srcfile
, int line
)
154 char buf
[GMX_FIO_BUFLEN
];
155 unsigned char *ucptr
;
158 gmx_fio_check_nitem(eio
, nitem
, srcfile
, line
);
164 res
= fprintf(fp
, "%18.10e%s\n", *((real
*) item
),
165 gmx_fio_dbgstr(fio
, desc
, buf
));
168 res
= fprintf(fp
, "%18d%s\n", *((int *) item
), gmx_fio_dbgstr(fio
,
173 sprintf(strbuf
, "%s%s%s", "%", GMX_PRId64
, "\n");
174 res
= fprintf(fp
, strbuf
, *((gmx_int64_t
*) item
),
175 gmx_fio_dbgstr(fio
, desc
, buf
));
178 res
= fprintf(fp
, "%4d%s\n", *((unsigned char *) item
),
179 gmx_fio_dbgstr(fio
, desc
, buf
));
182 ucptr
= (unsigned char *) item
;
183 for (i
= 0; (i
< nitem
); i
++)
185 res
= fprintf(fp
, "%4d", (int) ucptr
[i
]);
187 fprintf(fio
->fp
, "%s\n", gmx_fio_dbgstr(fio
, desc
, buf
));
190 res
= fprintf(fp
, "%18d%s\n", *((unsigned short *) item
),
191 gmx_fio_dbgstr(fio
, desc
, buf
));
195 res
= fprintf(fp
, "%18.10e%18.10e%18.10e%s\n", ptr
[XX
],
196 ptr
[YY
], ptr
[ZZ
], gmx_fio_dbgstr(fio
, desc
, buf
));
199 for (i
= 0; (i
< nitem
); i
++)
201 ptr
= ((rvec
*) item
)[i
];
202 res
= fprintf(fp
, "%18.10e%18.10e%18.10e%s\n", ptr
[XX
],
203 ptr
[YY
], ptr
[ZZ
], gmx_fio_dbgstr(fio
, desc
, buf
));
208 res
= fprintf(fp
, "%18d%18d%18d%s\n", iptr
[XX
], iptr
[YY
],
209 iptr
[ZZ
], gmx_fio_dbgstr(fio
, desc
, buf
));
212 encode_string(256, strbuf
, (char *) item
);
213 res
= fprintf(fp
, "%-18s%s\n", strbuf
, gmx_fio_dbgstr(fio
, desc
, buf
));
216 gmx_fio_fe(fio
, eio
, desc
, srcfile
, line
);
218 if ((res
<= 0) && fio
->bDebug
)
221 "Error writing %s %s to file %s (source %s, line %d)\n",
222 eioNames
[eio
], desc
, fio
->fn
, srcfile
, line
);
229 static char *next_item(FILE *fp
, char *buf
, int buflen
)
232 gmx_bool in_comment
= FALSE
;
233 gmx_bool in_token
= FALSE
;
235 /* This routine reads strings from the file fp, strips comment
236 * and buffers. For thread-safety reasons, It reads through getc() */
241 gmx_file("End of file");
254 if (isspace(rd
) || rd
== ';')
258 buf
[i
++] = (char) rd
;
271 buf
[i
++] = (char) (rd
);
280 while ((rd
= getc(fp
)) != EOF
);
282 fprintf(stderr
, "WARNING, ftpASC file type not tested!\n");
289 static gmx_bool
do_ascread(t_fileio
*fio
, void *item
, int nitem
, int eio
,
290 const char *desc
, const char *srcfile
, int line
)
293 int i
, m
, res
= 0, *iptr
, ix
;
297 unsigned char uc
, *ucptr
;
299 #define NEXT_ITEM_BUF_LEN 128
300 char ni_buf
[NEXT_ITEM_BUF_LEN
];
302 gmx_fio_check_nitem(eio
, nitem
, srcfile
, line
);
308 res
= sscanf(next_item(fp
, ni_buf
, NEXT_ITEM_BUF_LEN
), "%lf", &d
);
311 *((real
*) item
) = d
;
315 res
= sscanf(next_item(fp
, ni_buf
, NEXT_ITEM_BUF_LEN
), "%d", &i
);
322 res
= sscanf(next_item(fp
, ni_buf
, NEXT_ITEM_BUF_LEN
),
326 *((gmx_int64_t
*) item
) = s
;
330 res
= sscanf(next_item(fp
, ni_buf
, NEXT_ITEM_BUF_LEN
), "%c", &uc
);
333 *((unsigned char *) item
) = uc
;
337 ucptr
= (unsigned char *) item
;
338 for (i
= 0; (i
< nitem
); i
++)
340 res
= sscanf(next_item(fp
, ni_buf
, NEXT_ITEM_BUF_LEN
), "%d", &ix
);
348 res
= sscanf(next_item(fp
, ni_buf
, NEXT_ITEM_BUF_LEN
), "%d", &i
);
351 *((unsigned short *) item
) = i
;
356 for (m
= 0; (m
< DIM
); m
++)
358 res
= sscanf(next_item(fp
, ni_buf
, NEXT_ITEM_BUF_LEN
), "%lf\n", &x
);
363 for (i
= 0; (i
< nitem
); i
++)
365 ptr
= ((rvec
*) item
)[i
];
366 for (m
= 0; (m
< DIM
); m
++)
368 res
= sscanf(next_item(fp
, ni_buf
, NEXT_ITEM_BUF_LEN
), "%lf\n",
379 for (m
= 0; (m
< DIM
); m
++)
381 res
= sscanf(next_item(fp
, ni_buf
, NEXT_ITEM_BUF_LEN
), "%d\n", &ix
);
389 cptr
= next_item(fp
, ni_buf
, NEXT_ITEM_BUF_LEN
);
392 decode_string(strlen(cptr
) + 1, (char *) item
, cptr
);
393 /* res = sscanf(cptr,"%s",(char *)item);*/
398 gmx_fio_fe(fio
, eio
, desc
, srcfile
, line
);
401 if ((res
<= 0) && fio
->bDebug
)
404 "Error reading %s %s from file %s (source %s, line %d)\n",
405 eioNames
[eio
], desc
, fio
->fn
, srcfile
, line
);