Bug Summary

File:gromacs/gmxlib/index.c
Location:line 1065, column 29
Description:Array access (via field 'a') results in a null pointer dereference

Annotated Source Code

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,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.
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_H1
38#include <config.h>
39#endif
40
41#include <assert.h>
42#include <ctype.h>
43#include <stdlib.h>
44#include <string.h>
45
46#include "macros.h"
47#include "names.h"
48#include "typedefs.h"
49#include "invblock.h"
50#include "macros.h"
51#include "index.h"
52#include "txtdump.h"
53
54#include "gromacs/fileio/gmxfio.h"
55#include "gromacs/fileio/strdb.h"
56#include "gromacs/utility/cstringutil.h"
57#include "gromacs/utility/fatalerror.h"
58#include "gromacs/utility/futil.h"
59#include "gromacs/utility/smalloc.h"
60
61const char gmx_residuetype_undefined[] = "Other";
62
63struct gmx_residuetype
64{
65 int n;
66 char ** resname;
67 char ** restype;
68
69};
70
71
72static gmx_bool gmx_ask_yesno(gmx_bool bASK)
73{
74 char c;
75
76 if (bASK)
77 {
78 do
79 {
80 c = toupper(fgetc(stdin))(__extension__ ({ int __res; if (sizeof (fgetc(stdin)) > 1
) { if (__builtin_constant_p (fgetc(stdin))) { int __c = (fgetc
(stdin)); __res = __c < -128 || __c > 255 ? __c : (*__ctype_toupper_loc
())[__c]; } else __res = toupper (fgetc(stdin)); } else __res
= (*__ctype_toupper_loc ())[(int) (fgetc(stdin))]; __res; })
)
;
81 }
82 while ((c != 'Y') && (c != 'N'));
83
84 return (c == 'Y');
85 }
86 else
87 {
88 return FALSE0;
89 }
90}
91
92t_blocka *new_blocka(void)
93{
94 t_blocka *block;
95
96 snew(block, 1)(block) = save_calloc("block", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 96, (1), sizeof(*(block)))
;
97 snew(block->index, 1)(block->index) = save_calloc("block->index", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 97, (1), sizeof(*(block->index)))
;
98
99 return block;
100}
101
102void write_index(const char *outf, t_blocka *b, char **gnames, gmx_bool bDuplicate, int natoms)
103{
104 FILE *out;
105 int i, j, k;
106
107 out = gmx_fio_fopen(outf, "w");
108 /* fprintf(out,"%5d %5d\n",b->nr,b->nra); */
109 for (i = 0; (i < b->nr); i++)
110 {
111 fprintf(out, "[ %s ]\n", gnames[i]);
112 for (k = 0, j = b->index[i]; j < b->index[i+1]; j++, k++)
113 {
114 fprintf(out, "%4d ", b->a[j]+1);
115 if ((k % 15) == 14)
116 {
117 fprintf(out, "\n");
118 }
119 }
120 fprintf(out, "\n");
121 }
122
123 /* Duplicate copy, useful for computational electrophysiology double-layer setups */
124 if (bDuplicate)
125 {
126 fprintf(stderrstderr, "Duplicating the whole system with an atom offset of %d atoms.\n", natoms);
127 for (i = 0; (i < b->nr); i++)
128 {
129 fprintf(out, "[ %s_copy ]\n", gnames[i]);
130 for (k = 0, j = b->index[i]; j < b->index[i+1]; j++, k++)
131 {
132 fprintf(out, "%4d ", b->a[j]+1 + natoms );
133 if ((k % 15) == 14)
134 {
135 fprintf(out, "\n");
136 }
137 }
138 fprintf(out, "\n");
139 }
140 }
141
142 gmx_fio_fclose(out);
143}
144
145void add_grp(t_blocka *b, char ***gnames, int nra, atom_id a[], const char *name)
146{
147 int i;
148
149 srenew(b->index, b->nr+2)(b->index) = save_realloc("b->index", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 149, (b->index), (b->nr+2), sizeof(*(b->index)))
;
150 srenew(*gnames, b->nr+1)(*gnames) = save_realloc("*gnames", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 150, (*gnames), (b->nr+1), sizeof(*(*gnames)))
;
151 (*gnames)[b->nr] = strdup(name)(__extension__ (__builtin_constant_p (name) && ((size_t
)(const void *)((name) + 1) - (size_t)(const void *)(name) ==
1) ? (((const char *) (name))[0] == '\0' ? (char *) calloc (
(size_t) 1, (size_t) 1) : ({ size_t __len = strlen (name) + 1
; char *__retval = (char *) malloc (__len); if (__retval != (
(void*)0)) __retval = (char *) memcpy (__retval, name, __len)
; __retval; })) : __strdup (name)))
;
152
153 srenew(b->a, b->nra+nra)(b->a) = save_realloc("b->a", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 153, (b->a), (b->nra+nra), sizeof(*(b->a)))
;
154 for (i = 0; (i < nra); i++)
155 {
156 b->a[b->nra++] = a[i];
157 }
158 b->nr++;
159 b->index[b->nr] = b->nra;
160}
161
162/* compare index in `a' with group in `b' at `index',
163 when `index'<0 it is relative to end of `b' */
164static gmx_bool grp_cmp(t_blocka *b, int nra, atom_id a[], int index)
165{
166 int i;
167
168 if (index < 0)
169 {
170 index = b->nr-1+index;
171 }
172 if (index >= b->nr)
173 {
174 gmx_fatal(FARGS0, "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c",
174
, "no such index group %d in t_blocka (nr=%d)", index, b->nr);
175 }
176 /* compare sizes */
177 if (nra != b->index[index+1] - b->index[index])
178 {
179 return FALSE0;
180 }
181 for (i = 0; i < nra; i++)
182 {
183 if (a[i] != b->a[b->index[index]+i])
184 {
185 return FALSE0;
186 }
187 }
188 return TRUE1;
189}
190
191static void
192p_status(const char **restype, int nres, const char **typenames, int ntypes)
193{
194 int i, j;
195 int found;
196
197 int * counter;
198
199 snew(counter, ntypes)(counter) = save_calloc("counter", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 199, (ntypes), sizeof(*(counter)))
;
200 for (i = 0; i < ntypes; i++)
201 {
202 counter[i] = 0;
203 }
204 for (i = 0; i < nres; i++)
205 {
206 found = 0;
207 for (j = 0; j < ntypes; j++)
208 {
209 if (!gmx_strcasecmp(restype[i], typenames[j]))
210 {
211 counter[j]++;
212 }
213 }
214 }
215
216 for (i = 0; (i < ntypes); i++)
217 {
218 if (counter[i] > 0)
219 {
220 printf("There are: %5d %10s residues\n", counter[i], typenames[i]);
221 }
222 }
223
224 sfree(counter)save_free("counter", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 224, (counter))
;
225}
226
227
228atom_id *
229mk_aid(t_atoms *atoms, const char ** restype, const char * typestring, int *nra, gmx_bool bMatch)
230/* Make an array of atom_ids for all atoms with residuetypes matching typestring, or the opposite if bMatch is false */
231{
232 atom_id *a;
233 int i;
234 int res;
235
236 snew(a, atoms->nr)(a) = save_calloc("a", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 236, (atoms->nr), sizeof(*(a)))
;
237 *nra = 0;
238 for (i = 0; (i < atoms->nr); i++)
239 {
240 res = !gmx_strcasecmp(restype[atoms->atom[i].resind], typestring);
241 if (bMatch == FALSE0)
242 {
243 res = !res;
244 }
245 if (res)
246 {
247 a[(*nra)++] = i;
248 }
249 }
250
251 return a;
252}
253
254typedef struct {
255 char *rname;
256 gmx_bool bNeg;
257 char *gname;
258} restp_t;
259
260static void analyse_other(const char ** restype, t_atoms *atoms,
261 t_blocka *gb, char ***gn, gmx_bool bASK, gmx_bool bVerb)
262{
263 restp_t *restp = NULL((void*)0);
264 char **attp = NULL((void*)0);
265 char *rname, *aname;
266 atom_id *other_ndx, *aid, *aaid;
267 int i, j, k, l, resind, naid, naaid, natp, nrestp = 0;
268
269 for (i = 0; (i < atoms->nres); i++)
270 {
271 if (gmx_strcasecmp(restype[i], "Protein") && gmx_strcasecmp(restype[i], "DNA") && gmx_strcasecmp(restype[i], "RNA") && gmx_strcasecmp(restype[i], "Water"))
272 {
273 break;
274 }
275 }
276 if (i < atoms->nres)
277 {
278 /* we have others */
279 if (bVerb)
280 {
281 printf("Analysing residues not classified as Protein/DNA/RNA/Water and splitting into groups...\n");
282 }
283 snew(other_ndx, atoms->nr)(other_ndx) = save_calloc("other_ndx", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 283, (atoms->nr), sizeof(*(other_ndx)))
;
284 for (k = 0; (k < atoms->nr); k++)
285 {
286 resind = atoms->atom[k].resind;
287 rname = *atoms->resinfo[resind].name;
288 if (gmx_strcasecmp(restype[resind], "Protein") && gmx_strcasecmp(restype[resind], "DNA") &&
289 gmx_strcasecmp(restype[resind], "RNA") && gmx_strcasecmp(restype[resind], "Water"))
290 {
291
292 for (l = 0; (l < nrestp); l++)
293 {
294 if (strcmp(restp[l].rname, rname)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(restp[l].rname) && __builtin_constant_p (rname) &&
(__s1_len = strlen (restp[l].rname), __s2_len = strlen (rname
), (!((size_t)(const void *)((restp[l].rname) + 1) - (size_t)
(const void *)(restp[l].rname) == 1) || __s1_len >= 4) &&
(!((size_t)(const void *)((rname) + 1) - (size_t)(const void
*)(rname) == 1) || __s2_len >= 4)) ? __builtin_strcmp (restp
[l].rname, rname) : (__builtin_constant_p (restp[l].rname) &&
((size_t)(const void *)((restp[l].rname) + 1) - (size_t)(const
void *)(restp[l].rname) == 1) && (__s1_len = strlen (
restp[l].rname), __s1_len < 4) ? (__builtin_constant_p (rname
) && ((size_t)(const void *)((rname) + 1) - (size_t)(
const void *)(rname) == 1) ? __builtin_strcmp (restp[l].rname
, rname) : (__extension__ ({ const unsigned char *__s2 = (const
unsigned char *) (const char *) (rname); int __result = (((const
unsigned char *) (const char *) (restp[l].rname))[0] - __s2[
0]); if (__s1_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (restp[l].rname))
[1] - __s2[1]); if (__s1_len > 1 && __result == 0)
{ __result = (((const unsigned char *) (const char *) (restp
[l].rname))[2] - __s2[2]); if (__s1_len > 2 && __result
== 0) __result = (((const unsigned char *) (const char *) (restp
[l].rname))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p
(rname) && ((size_t)(const void *)((rname) + 1) - (size_t
)(const void *)(rname) == 1) && (__s2_len = strlen (rname
), __s2_len < 4) ? (__builtin_constant_p (restp[l].rname) &&
((size_t)(const void *)((restp[l].rname) + 1) - (size_t)(const
void *)(restp[l].rname) == 1) ? __builtin_strcmp (restp[l].rname
, rname) : (- (__extension__ ({ const unsigned char *__s2 = (
const unsigned char *) (const char *) (restp[l].rname); int __result
= (((const unsigned char *) (const char *) (rname))[0] - __s2
[0]); if (__s2_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (rname))[1] - __s2
[1]); if (__s2_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) (rname))[2] - __s2
[2]); if (__s2_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) (rname))[3] - __s2[
3]); } } __result; })))) : __builtin_strcmp (restp[l].rname, rname
)))); })
== 0)
295 {
296 break;
297 }
298 }
299 if (l == nrestp)
300 {
301 srenew(restp, nrestp+1)(restp) = save_realloc("restp", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 301, (restp), (nrestp+1), sizeof(*(restp)))
;
302 restp[nrestp].rname = strdup(rname)(__extension__ (__builtin_constant_p (rname) && ((size_t
)(const void *)((rname) + 1) - (size_t)(const void *)(rname) ==
1) ? (((const char *) (rname))[0] == '\0' ? (char *) calloc (
(size_t) 1, (size_t) 1) : ({ size_t __len = strlen (rname) + 1
; char *__retval = (char *) malloc (__len); if (__retval != (
(void*)0)) __retval = (char *) memcpy (__retval, rname, __len
); __retval; })) : __strdup (rname)))
;
303 restp[nrestp].bNeg = FALSE0;
304 restp[nrestp].gname = strdup(rname)(__extension__ (__builtin_constant_p (rname) && ((size_t
)(const void *)((rname) + 1) - (size_t)(const void *)(rname) ==
1) ? (((const char *) (rname))[0] == '\0' ? (char *) calloc (
(size_t) 1, (size_t) 1) : ({ size_t __len = strlen (rname) + 1
; char *__retval = (char *) malloc (__len); if (__retval != (
(void*)0)) __retval = (char *) memcpy (__retval, rname, __len
); __retval; })) : __strdup (rname)))
;
305 nrestp++;
306
307 }
308 }
309 }
310 for (i = 0; (i < nrestp); i++)
311 {
312 snew(aid, atoms->nr)(aid) = save_calloc("aid", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 312, (atoms->nr), sizeof(*(aid)))
;
313 naid = 0;
314 for (j = 0; (j < atoms->nr); j++)
315 {
316 rname = *atoms->resinfo[atoms->atom[j].resind].name;
317 if ((strcmp(restp[i].rname, rname)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(restp[i].rname) && __builtin_constant_p (rname) &&
(__s1_len = strlen (restp[i].rname), __s2_len = strlen (rname
), (!((size_t)(const void *)((restp[i].rname) + 1) - (size_t)
(const void *)(restp[i].rname) == 1) || __s1_len >= 4) &&
(!((size_t)(const void *)((rname) + 1) - (size_t)(const void
*)(rname) == 1) || __s2_len >= 4)) ? __builtin_strcmp (restp
[i].rname, rname) : (__builtin_constant_p (restp[i].rname) &&
((size_t)(const void *)((restp[i].rname) + 1) - (size_t)(const
void *)(restp[i].rname) == 1) && (__s1_len = strlen (
restp[i].rname), __s1_len < 4) ? (__builtin_constant_p (rname
) && ((size_t)(const void *)((rname) + 1) - (size_t)(
const void *)(rname) == 1) ? __builtin_strcmp (restp[i].rname
, rname) : (__extension__ ({ const unsigned char *__s2 = (const
unsigned char *) (const char *) (rname); int __result = (((const
unsigned char *) (const char *) (restp[i].rname))[0] - __s2[
0]); if (__s1_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (restp[i].rname))
[1] - __s2[1]); if (__s1_len > 1 && __result == 0)
{ __result = (((const unsigned char *) (const char *) (restp
[i].rname))[2] - __s2[2]); if (__s1_len > 2 && __result
== 0) __result = (((const unsigned char *) (const char *) (restp
[i].rname))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p
(rname) && ((size_t)(const void *)((rname) + 1) - (size_t
)(const void *)(rname) == 1) && (__s2_len = strlen (rname
), __s2_len < 4) ? (__builtin_constant_p (restp[i].rname) &&
((size_t)(const void *)((restp[i].rname) + 1) - (size_t)(const
void *)(restp[i].rname) == 1) ? __builtin_strcmp (restp[i].rname
, rname) : (- (__extension__ ({ const unsigned char *__s2 = (
const unsigned char *) (const char *) (restp[i].rname); int __result
= (((const unsigned char *) (const char *) (rname))[0] - __s2
[0]); if (__s2_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (rname))[1] - __s2
[1]); if (__s2_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) (rname))[2] - __s2
[2]); if (__s2_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) (rname))[3] - __s2[
3]); } } __result; })))) : __builtin_strcmp (restp[i].rname, rname
)))); })
== 0 && !restp[i].bNeg) ||
318 (strcmp(restp[i].rname, rname)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(restp[i].rname) && __builtin_constant_p (rname) &&
(__s1_len = strlen (restp[i].rname), __s2_len = strlen (rname
), (!((size_t)(const void *)((restp[i].rname) + 1) - (size_t)
(const void *)(restp[i].rname) == 1) || __s1_len >= 4) &&
(!((size_t)(const void *)((rname) + 1) - (size_t)(const void
*)(rname) == 1) || __s2_len >= 4)) ? __builtin_strcmp (restp
[i].rname, rname) : (__builtin_constant_p (restp[i].rname) &&
((size_t)(const void *)((restp[i].rname) + 1) - (size_t)(const
void *)(restp[i].rname) == 1) && (__s1_len = strlen (
restp[i].rname), __s1_len < 4) ? (__builtin_constant_p (rname
) && ((size_t)(const void *)((rname) + 1) - (size_t)(
const void *)(rname) == 1) ? __builtin_strcmp (restp[i].rname
, rname) : (__extension__ ({ const unsigned char *__s2 = (const
unsigned char *) (const char *) (rname); int __result = (((const
unsigned char *) (const char *) (restp[i].rname))[0] - __s2[
0]); if (__s1_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (restp[i].rname))
[1] - __s2[1]); if (__s1_len > 1 && __result == 0)
{ __result = (((const unsigned char *) (const char *) (restp
[i].rname))[2] - __s2[2]); if (__s1_len > 2 && __result
== 0) __result = (((const unsigned char *) (const char *) (restp
[i].rname))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p
(rname) && ((size_t)(const void *)((rname) + 1) - (size_t
)(const void *)(rname) == 1) && (__s2_len = strlen (rname
), __s2_len < 4) ? (__builtin_constant_p (restp[i].rname) &&
((size_t)(const void *)((restp[i].rname) + 1) - (size_t)(const
void *)(restp[i].rname) == 1) ? __builtin_strcmp (restp[i].rname
, rname) : (- (__extension__ ({ const unsigned char *__s2 = (
const unsigned char *) (const char *) (restp[i].rname); int __result
= (((const unsigned char *) (const char *) (rname))[0] - __s2
[0]); if (__s2_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (rname))[1] - __s2
[1]); if (__s2_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) (rname))[2] - __s2
[2]); if (__s2_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) (rname))[3] - __s2[
3]); } } __result; })))) : __builtin_strcmp (restp[i].rname, rname
)))); })
!= 0 && restp[i].bNeg))
319 {
320 aid[naid++] = j;
321 }
322 }
323 add_grp(gb, gn, naid, aid, restp[i].gname);
324 if (bASK)
325 {
326 printf("split %s into atoms (y/n) ? ", restp[i].gname);
327 fflush(stdoutstdout);
328 if (gmx_ask_yesno(bASK))
329 {
330 natp = 0;
331 for (k = 0; (k < naid); k++)
332 {
333 aname = *atoms->atomname[aid[k]];
334 for (l = 0; (l < natp); l++)
335 {
336 if (strcmp(aname, attp[l])__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(aname) && __builtin_constant_p (attp[l]) &&
(__s1_len = strlen (aname), __s2_len = strlen (attp[l]), (!(
(size_t)(const void *)((aname) + 1) - (size_t)(const void *)(
aname) == 1) || __s1_len >= 4) && (!((size_t)(const
void *)((attp[l]) + 1) - (size_t)(const void *)(attp[l]) == 1
) || __s2_len >= 4)) ? __builtin_strcmp (aname, attp[l]) :
(__builtin_constant_p (aname) && ((size_t)(const void
*)((aname) + 1) - (size_t)(const void *)(aname) == 1) &&
(__s1_len = strlen (aname), __s1_len < 4) ? (__builtin_constant_p
(attp[l]) && ((size_t)(const void *)((attp[l]) + 1) -
(size_t)(const void *)(attp[l]) == 1) ? __builtin_strcmp (aname
, attp[l]) : (__extension__ ({ const unsigned char *__s2 = (const
unsigned char *) (const char *) (attp[l]); int __result = ((
(const unsigned char *) (const char *) (aname))[0] - __s2[0])
; if (__s1_len > 0 && __result == 0) { __result = (
((const unsigned char *) (const char *) (aname))[1] - __s2[1]
); if (__s1_len > 1 && __result == 0) { __result =
(((const unsigned char *) (const char *) (aname))[2] - __s2[
2]); if (__s1_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) (aname))[3] - __s2[
3]); } } __result; }))) : (__builtin_constant_p (attp[l]) &&
((size_t)(const void *)((attp[l]) + 1) - (size_t)(const void
*)(attp[l]) == 1) && (__s2_len = strlen (attp[l]), __s2_len
< 4) ? (__builtin_constant_p (aname) && ((size_t)
(const void *)((aname) + 1) - (size_t)(const void *)(aname) ==
1) ? __builtin_strcmp (aname, attp[l]) : (- (__extension__ (
{ const unsigned char *__s2 = (const unsigned char *) (const char
*) (aname); int __result = (((const unsigned char *) (const char
*) (attp[l]))[0] - __s2[0]); if (__s2_len > 0 && __result
== 0) { __result = (((const unsigned char *) (const char *) (
attp[l]))[1] - __s2[1]); if (__s2_len > 1 && __result
== 0) { __result = (((const unsigned char *) (const char *) (
attp[l]))[2] - __s2[2]); if (__s2_len > 2 && __result
== 0) __result = (((const unsigned char *) (const char *) (attp
[l]))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (
aname, attp[l])))); })
== 0)
337 {
338 break;
339 }
340 }
341 if (l == natp)
342 {
343 srenew(attp, ++natp)(attp) = save_realloc("attp", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 343, (attp), (++natp), sizeof(*(attp)))
;
344 attp[natp-1] = aname;
345 }
346 }
347 if (natp > 1)
348 {
349 for (l = 0; (l < natp); l++)
350 {
351 snew(aaid, naid)(aaid) = save_calloc("aaid", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 351, (naid), sizeof(*(aaid)))
;
352 naaid = 0;
353 for (k = 0; (k < naid); k++)
354 {
355 aname = *atoms->atomname[aid[k]];
356 if (strcmp(aname, attp[l])__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(aname) && __builtin_constant_p (attp[l]) &&
(__s1_len = strlen (aname), __s2_len = strlen (attp[l]), (!(
(size_t)(const void *)((aname) + 1) - (size_t)(const void *)(
aname) == 1) || __s1_len >= 4) && (!((size_t)(const
void *)((attp[l]) + 1) - (size_t)(const void *)(attp[l]) == 1
) || __s2_len >= 4)) ? __builtin_strcmp (aname, attp[l]) :
(__builtin_constant_p (aname) && ((size_t)(const void
*)((aname) + 1) - (size_t)(const void *)(aname) == 1) &&
(__s1_len = strlen (aname), __s1_len < 4) ? (__builtin_constant_p
(attp[l]) && ((size_t)(const void *)((attp[l]) + 1) -
(size_t)(const void *)(attp[l]) == 1) ? __builtin_strcmp (aname
, attp[l]) : (__extension__ ({ const unsigned char *__s2 = (const
unsigned char *) (const char *) (attp[l]); int __result = ((
(const unsigned char *) (const char *) (aname))[0] - __s2[0])
; if (__s1_len > 0 && __result == 0) { __result = (
((const unsigned char *) (const char *) (aname))[1] - __s2[1]
); if (__s1_len > 1 && __result == 0) { __result =
(((const unsigned char *) (const char *) (aname))[2] - __s2[
2]); if (__s1_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) (aname))[3] - __s2[
3]); } } __result; }))) : (__builtin_constant_p (attp[l]) &&
((size_t)(const void *)((attp[l]) + 1) - (size_t)(const void
*)(attp[l]) == 1) && (__s2_len = strlen (attp[l]), __s2_len
< 4) ? (__builtin_constant_p (aname) && ((size_t)
(const void *)((aname) + 1) - (size_t)(const void *)(aname) ==
1) ? __builtin_strcmp (aname, attp[l]) : (- (__extension__ (
{ const unsigned char *__s2 = (const unsigned char *) (const char
*) (aname); int __result = (((const unsigned char *) (const char
*) (attp[l]))[0] - __s2[0]); if (__s2_len > 0 && __result
== 0) { __result = (((const unsigned char *) (const char *) (
attp[l]))[1] - __s2[1]); if (__s2_len > 1 && __result
== 0) { __result = (((const unsigned char *) (const char *) (
attp[l]))[2] - __s2[2]); if (__s2_len > 2 && __result
== 0) __result = (((const unsigned char *) (const char *) (attp
[l]))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (
aname, attp[l])))); })
== 0)
357 {
358 aaid[naaid++] = aid[k];
359 }
360 }
361 add_grp(gb, gn, naaid, aaid, attp[l]);
362 sfree(aaid)save_free("aaid", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 362, (aaid))
;
363 }
364 }
365 sfree(attp)save_free("attp", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 365, (attp))
;
366 attp = NULL((void*)0);
367 }
368 sfree(aid)save_free("aid", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 368, (aid))
;
369 }
370 }
371 sfree(other_ndx)save_free("other_ndx", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 371, (other_ndx))
;
372 }
373}
374
375/*! \brief
376 * Cata necessary to construct a single (protein) index group in
377 * analyse_prot().
378 */
379typedef struct gmx_help_make_index_group
380{
381 /** The set of atom names that will be used to form this index group */
382 const char **defining_atomnames;
383 /** Size of the defining_atomnames array */
384 const int num_defining_atomnames;
385 /** Name of this index group */
386 const char *group_name;
387 /** Whether the above atom names name the atoms in the group, or
388 those not in the group */
389 gmx_bool bTakeComplement;
390 /** The index in wholename gives the first item in the arrays of
391 atomnames that should be tested with 'gmx_strncasecmp' in stead of
392 gmx_strcasecmp, or -1 if all items should be tested with strcasecmp
393 This is comparable to using a '*' wildcard at the end of specific
394 atom names, but that is more involved to implement...
395 */
396 int wholename;
397 /** Only create this index group if it differs from the one specified in compareto,
398 where -1 means to always create this group. */
399 int compareto;
400} t_gmx_help_make_index_group;
401
402static void analyse_prot(const char ** restype, t_atoms *atoms,
403 t_blocka *gb, char ***gn, gmx_bool bASK, gmx_bool bVerb)
404{
405 /* lists of atomnames to be used in constructing index groups: */
406 static const char *pnoh[] = { "H", "HN" };
407 static const char *pnodum[] = {
408 "MN1", "MN2", "MCB1", "MCB2", "MCG1", "MCG2",
409 "MCD1", "MCD2", "MCE1", "MCE2", "MNZ1", "MNZ2"
410 };
411 static const char *calpha[] = { "CA" };
412 static const char *bb[] = { "N", "CA", "C" };
413 static const char *mc[] = { "N", "CA", "C", "O", "O1", "O2", "OC1", "OC2", "OT", "OXT" };
414 static const char *mcb[] = { "N", "CA", "CB", "C", "O", "O1", "O2", "OC1", "OC2", "OT", "OXT" };
415 static const char *mch[] = {
416 "N", "CA", "C", "O", "O1", "O2", "OC1", "OC2", "OT", "OXT",
417 "H1", "H2", "H3", "H", "HN"
418 };
419
420 static const t_gmx_help_make_index_group constructing_data[] =
421 {{ NULL((void*)0), 0, "Protein", TRUE1, -1, -1},
422 { pnoh, asize(pnoh)((int)(sizeof(pnoh)/sizeof((pnoh)[0]))), "Protein-H", TRUE1, 0, -1},
423 { calpha, asize(calpha)((int)(sizeof(calpha)/sizeof((calpha)[0]))), "C-alpha", FALSE0, -1, -1},
424 { bb, asize(bb)((int)(sizeof(bb)/sizeof((bb)[0]))), "Backbone", FALSE0, -1, -1},
425 { mc, asize(mc)((int)(sizeof(mc)/sizeof((mc)[0]))), "MainChain", FALSE0, -1, -1},
426 { mcb, asize(mcb)((int)(sizeof(mcb)/sizeof((mcb)[0]))), "MainChain+Cb", FALSE0, -1, -1},
427 { mch, asize(mch)((int)(sizeof(mch)/sizeof((mch)[0]))), "MainChain+H", FALSE0, -1, -1},
428 { mch, asize(mch)((int)(sizeof(mch)/sizeof((mch)[0]))), "SideChain", TRUE1, -1, -1},
429 { mch, asize(mch)((int)(sizeof(mch)/sizeof((mch)[0]))), "SideChain-H", TRUE1, 11, -1},
430 { pnodum, asize(pnodum)((int)(sizeof(pnodum)/sizeof((pnodum)[0]))), "Prot-Masses", TRUE1, -1, 0}, };
431 const int num_index_groups = asize(constructing_data)((int)(sizeof(constructing_data)/sizeof((constructing_data)[0
])))
;
432
433 int n, j;
434 atom_id *aid;
435 int nra, nnpres, npres;
436 gmx_bool match;
437 char ndx_name[STRLEN4096], *atnm;
438 int i;
439
440 if (bVerb)
441 {
442 printf("Analysing Protein...\n");
443 }
444 snew(aid, atoms->nr)(aid) = save_calloc("aid", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 444, (atoms->nr), sizeof(*(aid)))
;
445
446 /* calculate the number of protein residues */
447 npres = 0;
448 for (i = 0; (i < atoms->nres); i++)
449 {
450 if (0 == gmx_strcasecmp(restype[i], "Protein"))
451 {
452 npres++;
453 }
454 }
455 /* find matching or complement atoms */
456 for (i = 0; (i < (int)num_index_groups); i++)
457 {
458 nra = 0;
459 for (n = 0; (n < atoms->nr); n++)
460 {
461 if (0 == gmx_strcasecmp(restype[atoms->atom[n].resind], "Protein"))
462 {
463 match = FALSE0;
464 for (j = 0; (j < constructing_data[i].num_defining_atomnames); j++)
465 {
466 /* skip digits at beginning of atomname, e.g. 1H */
467 atnm = *atoms->atomname[n];
468 while (isdigit(atnm[0])((*__ctype_b_loc ())[(int) ((atnm[0]))] & (unsigned short
int) _ISdigit)
)
469 {
470 atnm++;
471 }
472 if ( (constructing_data[i].wholename == -1) || (j < constructing_data[i].wholename) )
473 {
474 if (0 == gmx_strcasecmp(constructing_data[i].defining_atomnames[j], atnm))
475 {
476 match = TRUE1;
477 }
478 }
479 else
480 {
481 if (0 == gmx_strncasecmp(constructing_data[i].defining_atomnames[j], atnm, strlen(constructing_data[i].defining_atomnames[j])))
482 {
483 match = TRUE1;
484 }
485 }
486 }
487 if (constructing_data[i].bTakeComplement != match)
488 {
489 aid[nra++] = n;
490 }
491 }
492 }
493 /* if we want to add this group always or it differs from previous
494 group, add it: */
495 if (-1 == constructing_data[i].compareto || !grp_cmp(gb, nra, aid, constructing_data[i].compareto-i) )
496 {
497 add_grp(gb, gn, nra, aid, constructing_data[i].group_name);
498 }
499 }
500
501 if (bASK)
502 {
503 for (i = 0; (i < (int)num_index_groups); i++)
504 {
505 printf("Split %12s into %5d residues (y/n) ? ", constructing_data[i].group_name, npres);
506 if (gmx_ask_yesno(bASK))
507 {
508 int resind;
509 nra = 0;
510 for (n = 0; ((atoms->atom[n].resind < npres) && (n < atoms->nr)); )
511 {
512 resind = atoms->atom[n].resind;
513 for (; ((atoms->atom[n].resind == resind) && (n < atoms->nr)); n++)
514 {
515 match = FALSE0;
516 for (j = 0; (j < constructing_data[i].num_defining_atomnames); j++)
517 {
518 if (0 == gmx_strcasecmp(constructing_data[i].defining_atomnames[j], *atoms->atomname[n]))
519 {
520 match = TRUE1;
521 }
522 }
523 if (constructing_data[i].bTakeComplement != match)
524 {
525 aid[nra++] = n;
526 }
527 }
528 /* copy the residuename to the tail of the groupname */
529 if (nra > 0)
530 {
531 t_resinfo *ri;
532 ri = &atoms->resinfo[resind];
533 sprintf(ndx_name, "%s_%s%d%c",
534 constructing_data[i].group_name, *ri->name, ri->nr, ri->ic == ' ' ? '\0' : ri->ic);
535 add_grp(gb, gn, nra, aid, ndx_name);
536 nra = 0;
537 }
538 }
539 }
540 }
541 printf("Make group with sidechain and C=O swapped (y/n) ? ");
542 if (gmx_ask_yesno(bASK))
543 {
544 /* Make swap sidechain C=O index */
545 int resind, hold;
546 nra = 0;
547 for (n = 0; ((atoms->atom[n].resind < npres) && (n < atoms->nr)); )
548 {
549 resind = atoms->atom[n].resind;
550 hold = -1;
551 for (; ((atoms->atom[n].resind == resind) && (n < atoms->nr)); n++)
552 {
553 if (strcmp("CA", *atoms->atomname[n])__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
("CA") && __builtin_constant_p (*atoms->atomname[
n]) && (__s1_len = strlen ("CA"), __s2_len = strlen (
*atoms->atomname[n]), (!((size_t)(const void *)(("CA") + 1
) - (size_t)(const void *)("CA") == 1) || __s1_len >= 4) &&
(!((size_t)(const void *)((*atoms->atomname[n]) + 1) - (size_t
)(const void *)(*atoms->atomname[n]) == 1) || __s2_len >=
4)) ? __builtin_strcmp ("CA", *atoms->atomname[n]) : (__builtin_constant_p
("CA") && ((size_t)(const void *)(("CA") + 1) - (size_t
)(const void *)("CA") == 1) && (__s1_len = strlen ("CA"
), __s1_len < 4) ? (__builtin_constant_p (*atoms->atomname
[n]) && ((size_t)(const void *)((*atoms->atomname[
n]) + 1) - (size_t)(const void *)(*atoms->atomname[n]) == 1
) ? __builtin_strcmp ("CA", *atoms->atomname[n]) : (__extension__
({ const unsigned char *__s2 = (const unsigned char *) (const
char *) (*atoms->atomname[n]); int __result = (((const unsigned
char *) (const char *) ("CA"))[0] - __s2[0]); if (__s1_len >
0 && __result == 0) { __result = (((const unsigned char
*) (const char *) ("CA"))[1] - __s2[1]); if (__s1_len > 1
&& __result == 0) { __result = (((const unsigned char
*) (const char *) ("CA"))[2] - __s2[2]); if (__s1_len > 2
&& __result == 0) __result = (((const unsigned char *
) (const char *) ("CA"))[3] - __s2[3]); } } __result; }))) : (
__builtin_constant_p (*atoms->atomname[n]) && ((size_t
)(const void *)((*atoms->atomname[n]) + 1) - (size_t)(const
void *)(*atoms->atomname[n]) == 1) && (__s2_len =
strlen (*atoms->atomname[n]), __s2_len < 4) ? (__builtin_constant_p
("CA") && ((size_t)(const void *)(("CA") + 1) - (size_t
)(const void *)("CA") == 1) ? __builtin_strcmp ("CA", *atoms->
atomname[n]) : (- (__extension__ ({ const unsigned char *__s2
= (const unsigned char *) (const char *) ("CA"); int __result
= (((const unsigned char *) (const char *) (*atoms->atomname
[n]))[0] - __s2[0]); if (__s2_len > 0 && __result ==
0) { __result = (((const unsigned char *) (const char *) (*atoms
->atomname[n]))[1] - __s2[1]); if (__s2_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (*atoms->atomname[n]))[2] - __s2[2]); if (__s2_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) (*atoms->atomname[n]))[3] - __s2[3
]); } } __result; })))) : __builtin_strcmp ("CA", *atoms->
atomname[n])))); })
== 0)
554 {
555 aid[nra++] = n;
556 hold = nra;
557 nra += 2;
558 }
559 else if (strcmp("C", *atoms->atomname[n])__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
("C") && __builtin_constant_p (*atoms->atomname[n
]) && (__s1_len = strlen ("C"), __s2_len = strlen (*atoms
->atomname[n]), (!((size_t)(const void *)(("C") + 1) - (size_t
)(const void *)("C") == 1) || __s1_len >= 4) && (!
((size_t)(const void *)((*atoms->atomname[n]) + 1) - (size_t
)(const void *)(*atoms->atomname[n]) == 1) || __s2_len >=
4)) ? __builtin_strcmp ("C", *atoms->atomname[n]) : (__builtin_constant_p
("C") && ((size_t)(const void *)(("C") + 1) - (size_t
)(const void *)("C") == 1) && (__s1_len = strlen ("C"
), __s1_len < 4) ? (__builtin_constant_p (*atoms->atomname
[n]) && ((size_t)(const void *)((*atoms->atomname[
n]) + 1) - (size_t)(const void *)(*atoms->atomname[n]) == 1
) ? __builtin_strcmp ("C", *atoms->atomname[n]) : (__extension__
({ const unsigned char *__s2 = (const unsigned char *) (const
char *) (*atoms->atomname[n]); int __result = (((const unsigned
char *) (const char *) ("C"))[0] - __s2[0]); if (__s1_len >
0 && __result == 0) { __result = (((const unsigned char
*) (const char *) ("C"))[1] - __s2[1]); if (__s1_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) ("C"))[2] - __s2[2]); if (__s1_len > 2 &&
__result == 0) __result = (((const unsigned char *) (const char
*) ("C"))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p
(*atoms->atomname[n]) && ((size_t)(const void *)(
(*atoms->atomname[n]) + 1) - (size_t)(const void *)(*atoms
->atomname[n]) == 1) && (__s2_len = strlen (*atoms
->atomname[n]), __s2_len < 4) ? (__builtin_constant_p (
"C") && ((size_t)(const void *)(("C") + 1) - (size_t)
(const void *)("C") == 1) ? __builtin_strcmp ("C", *atoms->
atomname[n]) : (- (__extension__ ({ const unsigned char *__s2
= (const unsigned char *) (const char *) ("C"); int __result
= (((const unsigned char *) (const char *) (*atoms->atomname
[n]))[0] - __s2[0]); if (__s2_len > 0 && __result ==
0) { __result = (((const unsigned char *) (const char *) (*atoms
->atomname[n]))[1] - __s2[1]); if (__s2_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (*atoms->atomname[n]))[2] - __s2[2]); if (__s2_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) (*atoms->atomname[n]))[3] - __s2[3
]); } } __result; })))) : __builtin_strcmp ("C", *atoms->atomname
[n])))); })
== 0)
560 {
561 if (hold == -1)
562 {
563 gmx_incons("Atom naming problem")_gmx_error("incons", "Atom naming problem", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 563)
;
564 }
565 aid[hold] = n;
566 }
567 else if (strcmp("O", *atoms->atomname[n])__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
("O") && __builtin_constant_p (*atoms->atomname[n
]) && (__s1_len = strlen ("O"), __s2_len = strlen (*atoms
->atomname[n]), (!((size_t)(const void *)(("O") + 1) - (size_t
)(const void *)("O") == 1) || __s1_len >= 4) && (!
((size_t)(const void *)((*atoms->atomname[n]) + 1) - (size_t
)(const void *)(*atoms->atomname[n]) == 1) || __s2_len >=
4)) ? __builtin_strcmp ("O", *atoms->atomname[n]) : (__builtin_constant_p
("O") && ((size_t)(const void *)(("O") + 1) - (size_t
)(const void *)("O") == 1) && (__s1_len = strlen ("O"
), __s1_len < 4) ? (__builtin_constant_p (*atoms->atomname
[n]) && ((size_t)(const void *)((*atoms->atomname[
n]) + 1) - (size_t)(const void *)(*atoms->atomname[n]) == 1
) ? __builtin_strcmp ("O", *atoms->atomname[n]) : (__extension__
({ const unsigned char *__s2 = (const unsigned char *) (const
char *) (*atoms->atomname[n]); int __result = (((const unsigned
char *) (const char *) ("O"))[0] - __s2[0]); if (__s1_len >
0 && __result == 0) { __result = (((const unsigned char
*) (const char *) ("O"))[1] - __s2[1]); if (__s1_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) ("O"))[2] - __s2[2]); if (__s1_len > 2 &&
__result == 0) __result = (((const unsigned char *) (const char
*) ("O"))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p
(*atoms->atomname[n]) && ((size_t)(const void *)(
(*atoms->atomname[n]) + 1) - (size_t)(const void *)(*atoms
->atomname[n]) == 1) && (__s2_len = strlen (*atoms
->atomname[n]), __s2_len < 4) ? (__builtin_constant_p (
"O") && ((size_t)(const void *)(("O") + 1) - (size_t)
(const void *)("O") == 1) ? __builtin_strcmp ("O", *atoms->
atomname[n]) : (- (__extension__ ({ const unsigned char *__s2
= (const unsigned char *) (const char *) ("O"); int __result
= (((const unsigned char *) (const char *) (*atoms->atomname
[n]))[0] - __s2[0]); if (__s2_len > 0 && __result ==
0) { __result = (((const unsigned char *) (const char *) (*atoms
->atomname[n]))[1] - __s2[1]); if (__s2_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (*atoms->atomname[n]))[2] - __s2[2]); if (__s2_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) (*atoms->atomname[n]))[3] - __s2[3
]); } } __result; })))) : __builtin_strcmp ("O", *atoms->atomname
[n])))); })
== 0)
568 {
569 if (hold == -1)
570 {
571 gmx_incons("Atom naming problem")_gmx_error("incons", "Atom naming problem", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 571)
;
572 }
573 aid[hold+1] = n;
574 }
575 else if (strcmp("O1", *atoms->atomname[n])__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
("O1") && __builtin_constant_p (*atoms->atomname[
n]) && (__s1_len = strlen ("O1"), __s2_len = strlen (
*atoms->atomname[n]), (!((size_t)(const void *)(("O1") + 1
) - (size_t)(const void *)("O1") == 1) || __s1_len >= 4) &&
(!((size_t)(const void *)((*atoms->atomname[n]) + 1) - (size_t
)(const void *)(*atoms->atomname[n]) == 1) || __s2_len >=
4)) ? __builtin_strcmp ("O1", *atoms->atomname[n]) : (__builtin_constant_p
("O1") && ((size_t)(const void *)(("O1") + 1) - (size_t
)(const void *)("O1") == 1) && (__s1_len = strlen ("O1"
), __s1_len < 4) ? (__builtin_constant_p (*atoms->atomname
[n]) && ((size_t)(const void *)((*atoms->atomname[
n]) + 1) - (size_t)(const void *)(*atoms->atomname[n]) == 1
) ? __builtin_strcmp ("O1", *atoms->atomname[n]) : (__extension__
({ const unsigned char *__s2 = (const unsigned char *) (const
char *) (*atoms->atomname[n]); int __result = (((const unsigned
char *) (const char *) ("O1"))[0] - __s2[0]); if (__s1_len >
0 && __result == 0) { __result = (((const unsigned char
*) (const char *) ("O1"))[1] - __s2[1]); if (__s1_len > 1
&& __result == 0) { __result = (((const unsigned char
*) (const char *) ("O1"))[2] - __s2[2]); if (__s1_len > 2
&& __result == 0) __result = (((const unsigned char *
) (const char *) ("O1"))[3] - __s2[3]); } } __result; }))) : (
__builtin_constant_p (*atoms->atomname[n]) && ((size_t
)(const void *)((*atoms->atomname[n]) + 1) - (size_t)(const
void *)(*atoms->atomname[n]) == 1) && (__s2_len =
strlen (*atoms->atomname[n]), __s2_len < 4) ? (__builtin_constant_p
("O1") && ((size_t)(const void *)(("O1") + 1) - (size_t
)(const void *)("O1") == 1) ? __builtin_strcmp ("O1", *atoms->
atomname[n]) : (- (__extension__ ({ const unsigned char *__s2
= (const unsigned char *) (const char *) ("O1"); int __result
= (((const unsigned char *) (const char *) (*atoms->atomname
[n]))[0] - __s2[0]); if (__s2_len > 0 && __result ==
0) { __result = (((const unsigned char *) (const char *) (*atoms
->atomname[n]))[1] - __s2[1]); if (__s2_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (*atoms->atomname[n]))[2] - __s2[2]); if (__s2_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) (*atoms->atomname[n]))[3] - __s2[3
]); } } __result; })))) : __builtin_strcmp ("O1", *atoms->
atomname[n])))); })
== 0)
576 {
577 if (hold == -1)
578 {
579 gmx_incons("Atom naming problem")_gmx_error("incons", "Atom naming problem", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 579)
;
580 }
581 aid[hold+1] = n;
582 }
583 else
584 {
585 aid[nra++] = n;
586 }
587 }
588 }
589 /* copy the residuename to the tail of the groupname */
590 if (nra > 0)
591 {
592 add_grp(gb, gn, nra, aid, "SwapSC-CO");
593 nra = 0;
594 }
595 }
596 }
597 sfree(aid)save_free("aid", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 597, (aid))
;
598}
599
600
601
602
603/* Return 0 if the name was found, otherwise -1.
604 * p_restype is set to a pointer to the type name, or 'Other' if we did not find it.
605 */
606int
607gmx_residuetype_get_type(gmx_residuetype_t rt, const char * resname, const char ** p_restype)
608{
609 int i, rc;
610
611 rc = -1;
612 for (i = 0; i < rt->n && rc; i++)
613 {
614 rc = gmx_strcasecmp(rt->resname[i], resname);
615 }
616
617 *p_restype = (rc == 0) ? rt->restype[i-1] : gmx_residuetype_undefined;
618
619 return rc;
620}
621
622int
623gmx_residuetype_add(gmx_residuetype_t rt, const char *newresname, const char *newrestype)
624{
625 int i;
626 int found;
627 const char * p_oldtype;
628
629 found = !gmx_residuetype_get_type(rt, newresname, &p_oldtype);
630
631 if (found && gmx_strcasecmp(p_oldtype, newrestype))
632 {
633 fprintf(stderrstderr, "Warning: Residue '%s' already present with type '%s' in database, ignoring new type '%s'.",
634 newresname, p_oldtype, newrestype);
635 }
636
637 if (found == 0)
638 {
639 srenew(rt->resname, rt->n+1)(rt->resname) = save_realloc("rt->resname", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 639, (rt->resname), (rt->n+1), sizeof(*(rt->resname
)))
;
640 srenew(rt->restype, rt->n+1)(rt->restype) = save_realloc("rt->restype", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 640, (rt->restype), (rt->n+1), sizeof(*(rt->restype
)))
;
641 rt->resname[rt->n] = strdup(newresname)(__extension__ (__builtin_constant_p (newresname) && (
(size_t)(const void *)((newresname) + 1) - (size_t)(const void
*)(newresname) == 1) ? (((const char *) (newresname))[0] == '\0'
? (char *) calloc ((size_t) 1, (size_t) 1) : ({ size_t __len
= strlen (newresname) + 1; char *__retval = (char *) malloc (
__len); if (__retval != ((void*)0)) __retval = (char *) memcpy
(__retval, newresname, __len); __retval; })) : __strdup (newresname
)))
;
642 rt->restype[rt->n] = strdup(newrestype)(__extension__ (__builtin_constant_p (newrestype) && (
(size_t)(const void *)((newrestype) + 1) - (size_t)(const void
*)(newrestype) == 1) ? (((const char *) (newrestype))[0] == '\0'
? (char *) calloc ((size_t) 1, (size_t) 1) : ({ size_t __len
= strlen (newrestype) + 1; char *__retval = (char *) malloc (
__len); if (__retval != ((void*)0)) __retval = (char *) memcpy
(__retval, newrestype, __len); __retval; })) : __strdup (newrestype
)))
;
643 rt->n++;
644 }
645
646 return 0;
647}
648
649
650int
651gmx_residuetype_init(gmx_residuetype_t *prt)
652{
653 FILE * db;
654 char line[STRLEN4096];
655 char resname[STRLEN4096], restype[STRLEN4096], dum[STRLEN4096];
656 char * p;
657 int i;
658 struct gmx_residuetype *rt;
659
660 snew(rt, 1)(rt) = save_calloc("rt", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 660, (1), sizeof(*(rt)))
;
661 *prt = rt;
662
663 rt->n = 0;
664 rt->resname = NULL((void*)0);
665 rt->restype = NULL((void*)0);
666
667 db = libopen("residuetypes.dat");
668
669 while (get_a_line(db, line, STRLEN4096))
670 {
671 strip_comment(line);
672 trim(line);
673 if (line[0] != '\0')
674 {
675 if (sscanf(line, "%s %s %s", resname, restype, dum) != 2)
676 {
677 gmx_fatal(FARGS0, "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c",
677
, "Incorrect number of columns (2 expected) for line in residuetypes.dat");
678 }
679 gmx_residuetype_add(rt, resname, restype);
680 }
681 }
682
683 fclose(db);
684
685 return 0;
686}
687
688
689
690int
691gmx_residuetype_destroy(gmx_residuetype_t rt)
692{
693 int i;
694
695 for (i = 0; i < rt->n; i++)
696 {
697 sfree(rt->resname[i])save_free("rt->resname[i]", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 697, (rt->resname[i]))
;
698 sfree(rt->restype[i])save_free("rt->restype[i]", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 698, (rt->restype[i]))
;
699 }
700 sfree(rt->resname)save_free("rt->resname", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 700, (rt->resname))
;
701 sfree(rt->restype)save_free("rt->restype", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 701, (rt->restype))
;
702 sfree(rt)save_free("rt", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 702, (rt))
;
703
704 return 0;
705}
706
707int
708gmx_residuetype_get_alltypes(gmx_residuetype_t rt,
709 const char *** p_typenames,
710 int * ntypes)
711{
712 int i, j, n;
713 int found;
714 const char ** my_typename;
715 char * p;
716
717 n = 0;
718
719 my_typename = NULL((void*)0);
720 for (i = 0; i < rt->n; i++)
721 {
722 p = rt->restype[i];
723 found = 0;
724 for (j = 0; j < n && !found; j++)
725 {
726 found = !gmx_strcasecmp(p, my_typename[j]);
727 }
728
729 if (!found)
730 {
731 srenew(my_typename, n+1)(my_typename) = save_realloc("my_typename", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 731, (my_typename), (n+1), sizeof(*(my_typename)))
;
732 my_typename[n] = p;
733 n++;
734 }
735 }
736 *ntypes = n;
737 *p_typenames = my_typename;
738
739 return 0;
740}
741
742
743
744gmx_bool
745gmx_residuetype_is_protein(gmx_residuetype_t rt, const char *resnm)
746{
747 gmx_bool rc;
748 const char *p_type;
749
750 if (gmx_residuetype_get_type(rt, resnm, &p_type) == 0 &&
751 gmx_strcasecmp(p_type, "Protein") == 0)
752 {
753 rc = TRUE1;
754 }
755 else
756 {
757 rc = FALSE0;
758 }
759 return rc;
760}
761
762gmx_bool
763gmx_residuetype_is_dna(gmx_residuetype_t rt, const char *resnm)
764{
765 gmx_bool rc;
766 const char *p_type;
767
768 if (gmx_residuetype_get_type(rt, resnm, &p_type) == 0 &&
769 gmx_strcasecmp(p_type, "DNA") == 0)
770 {
771 rc = TRUE1;
772 }
773 else
774 {
775 rc = FALSE0;
776 }
777 return rc;
778}
779
780gmx_bool
781gmx_residuetype_is_rna(gmx_residuetype_t rt, const char *resnm)
782{
783 gmx_bool rc;
784 const char *p_type;
785
786 if (gmx_residuetype_get_type(rt, resnm, &p_type) == 0 &&
787 gmx_strcasecmp(p_type, "RNA") == 0)
788 {
789 rc = TRUE1;
790 }
791 else
792 {
793 rc = FALSE0;
794 }
795 return rc;
796}
797
798/* Return the size of the arrays */
799int
800gmx_residuetype_get_size(gmx_residuetype_t rt)
801{
802 return rt->n;
803}
804
805/* Search for a residuetype with name resnm within the
806 * gmx_residuetype database. Return the index if found,
807 * otherwise -1.
808 */
809int
810gmx_residuetype_get_index(gmx_residuetype_t rt, const char *resnm)
811{
812 int i, rc;
813
814 rc = -1;
815 for (i = 0; i < rt->n && rc; i++)
816 {
817 rc = gmx_strcasecmp(rt->resname[i], resnm);
818 }
819
820 return (0 == rc) ? i-1 : -1;
821}
822
823/* Return the name of the residuetype with the given index, or
824 * NULL if not found. */
825const char *
826gmx_residuetype_get_name(gmx_residuetype_t rt, int index)
827{
828 if (index >= 0 && index < rt->n)
829 {
830 return rt->resname[index];
831 }
832 else
833 {
834 return NULL((void*)0);
835 }
836}
837
838
839
840void analyse(t_atoms *atoms, t_blocka *gb, char ***gn, gmx_bool bASK, gmx_bool bVerb)
841{
842 gmx_residuetype_t rt = NULL((void*)0);
843 char *resnm;
844 atom_id *aid;
845 const char ** restype;
846 int nra;
847 int i, k;
848 size_t j;
849 int ntypes;
850 char * p;
851 const char ** p_typename;
852 int iwater, iion;
853 int nwater, nion;
854 int found;
855
856 if (bVerb)
857 {
858 printf("Analysing residue names:\n");
859 }
860 /* Create system group, every single atom */
861 snew(aid, atoms->nr)(aid) = save_calloc("aid", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 861, (atoms->nr), sizeof(*(aid)))
;
862 for (i = 0; i < atoms->nr; i++)
863 {
864 aid[i] = i;
865 }
866 add_grp(gb, gn, atoms->nr, aid, "System");
867 sfree(aid)save_free("aid", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 867, (aid))
;
868
869 /* For every residue, get a pointer to the residue type name */
870 gmx_residuetype_init(&rt);
871 assert(rt)((void) (0));
872
873 snew(restype, atoms->nres)(restype) = save_calloc("restype", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 873, (atoms->nres), sizeof(*(restype)))
;
874 ntypes = 0;
875 p_typename = NULL((void*)0);
876 for (i = 0; i < atoms->nres; i++)
877 {
878 resnm = *atoms->resinfo[i].name;
879 gmx_residuetype_get_type(rt, resnm, &(restype[i]));
880
881 /* Note that this does not lead to a N*N loop, but N*K, where
882 * K is the number of residue _types_, which is small and independent of N.
883 */
884 found = 0;
885 for (k = 0; k < ntypes && !found; k++)
886 {
887 found = !strcmp(restype[i], p_typename[k])__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(restype[i]) && __builtin_constant_p (p_typename[k])
&& (__s1_len = strlen (restype[i]), __s2_len = strlen
(p_typename[k]), (!((size_t)(const void *)((restype[i]) + 1)
- (size_t)(const void *)(restype[i]) == 1) || __s1_len >=
4) && (!((size_t)(const void *)((p_typename[k]) + 1)
- (size_t)(const void *)(p_typename[k]) == 1) || __s2_len >=
4)) ? __builtin_strcmp (restype[i], p_typename[k]) : (__builtin_constant_p
(restype[i]) && ((size_t)(const void *)((restype[i])
+ 1) - (size_t)(const void *)(restype[i]) == 1) && (
__s1_len = strlen (restype[i]), __s1_len < 4) ? (__builtin_constant_p
(p_typename[k]) && ((size_t)(const void *)((p_typename
[k]) + 1) - (size_t)(const void *)(p_typename[k]) == 1) ? __builtin_strcmp
(restype[i], p_typename[k]) : (__extension__ ({ const unsigned
char *__s2 = (const unsigned char *) (const char *) (p_typename
[k]); int __result = (((const unsigned char *) (const char *)
(restype[i]))[0] - __s2[0]); if (__s1_len > 0 && __result
== 0) { __result = (((const unsigned char *) (const char *) (
restype[i]))[1] - __s2[1]); if (__s1_len > 1 && __result
== 0) { __result = (((const unsigned char *) (const char *) (
restype[i]))[2] - __s2[2]); if (__s1_len > 2 && __result
== 0) __result = (((const unsigned char *) (const char *) (restype
[i]))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p
(p_typename[k]) && ((size_t)(const void *)((p_typename
[k]) + 1) - (size_t)(const void *)(p_typename[k]) == 1) &&
(__s2_len = strlen (p_typename[k]), __s2_len < 4) ? (__builtin_constant_p
(restype[i]) && ((size_t)(const void *)((restype[i])
+ 1) - (size_t)(const void *)(restype[i]) == 1) ? __builtin_strcmp
(restype[i], p_typename[k]) : (- (__extension__ ({ const unsigned
char *__s2 = (const unsigned char *) (const char *) (restype
[i]); int __result = (((const unsigned char *) (const char *)
(p_typename[k]))[0] - __s2[0]); if (__s2_len > 0 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (p_typename[k]))[1] - __s2[1]); if (__s2_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (p_typename[k]))[2] - __s2[2]); if (__s2_len > 2 &&
__result == 0) __result = (((const unsigned char *) (const char
*) (p_typename[k]))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp
(restype[i], p_typename[k])))); })
;
888 }
889 if (!found)
890 {
891 srenew(p_typename, ntypes+1)(p_typename) = save_realloc("p_typename", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 891, (p_typename), (ntypes+1), sizeof(*(p_typename)))
;
892 p_typename[ntypes++] = strdup(restype[i])(__extension__ (__builtin_constant_p (restype[i]) && (
(size_t)(const void *)((restype[i]) + 1) - (size_t)(const void
*)(restype[i]) == 1) ? (((const char *) (restype[i]))[0] == '\0'
? (char *) calloc ((size_t) 1, (size_t) 1) : ({ size_t __len
= strlen (restype[i]) + 1; char *__retval = (char *) malloc (
__len); if (__retval != ((void*)0)) __retval = (char *) memcpy
(__retval, restype[i], __len); __retval; })) : __strdup (restype
[i])))
;
893 }
894 }
895
896 if (bVerb)
897 {
898 p_status(restype, atoms->nres, p_typename, ntypes);
899 }
900
901 for (k = 0; k < ntypes; k++)
902 {
903 aid = mk_aid(atoms, restype, p_typename[k], &nra, TRUE1);
904
905 /* Check for special types to do fancy stuff with */
906
907 if (!gmx_strcasecmp(p_typename[k], "Protein") && nra > 0)
908 {
909 sfree(aid)save_free("aid", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 909, (aid))
;
910 /* PROTEIN */
911 analyse_prot(restype, atoms, gb, gn, bASK, bVerb);
912
913 /* Create a Non-Protein group */
914 aid = mk_aid(atoms, restype, "Protein", &nra, FALSE0);
915 if ((nra > 0) && (nra < atoms->nr))
916 {
917 add_grp(gb, gn, nra, aid, "non-Protein");
918 }
919 sfree(aid)save_free("aid", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 919, (aid))
;
920 }
921 else if (!gmx_strcasecmp(p_typename[k], "Water") && nra > 0)
922 {
923 add_grp(gb, gn, nra, aid, p_typename[k]);
924 /* Add this group as 'SOL' too, for backward compatibility with older gromacs versions */
925 add_grp(gb, gn, nra, aid, "SOL");
926
927 sfree(aid)save_free("aid", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 927, (aid))
;
928
929 /* Solvent, create a negated group too */
930 aid = mk_aid(atoms, restype, "Water", &nra, FALSE0);
931 if ((nra > 0) && (nra < atoms->nr))
932 {
933 add_grp(gb, gn, nra, aid, "non-Water");
934 }
935 sfree(aid)save_free("aid", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 935, (aid))
;
936 }
937 else if (nra > 0)
938 {
939 /* Other groups */
940 add_grp(gb, gn, nra, aid, p_typename[k]);
941 sfree(aid)save_free("aid", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 941, (aid))
;
942 analyse_other(restype, atoms, gb, gn, bASK, bVerb);
943 }
944 }
945
946 sfree(p_typename)save_free("p_typename", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 946, (p_typename))
;
947 sfree(restype)save_free("restype", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 947, (restype))
;
948 gmx_residuetype_destroy(rt);
949
950 /* Create a merged water_and_ions group */
951 iwater = -1;
952 iion = -1;
953 nwater = 0;
954 nion = 0;
955
956 for (i = 0; i < gb->nr; i++)
957 {
958 if (!gmx_strcasecmp((*gn)[i], "Water"))
959 {
960 iwater = i;
961 nwater = gb->index[i+1]-gb->index[i];
962 }
963 else if (!gmx_strcasecmp((*gn)[i], "Ion"))
964 {
965 iion = i;
966 nion = gb->index[i+1]-gb->index[i];
967 }
968 }
969
970 if (nwater > 0 && nion > 0)
971 {
972 srenew(gb->index, gb->nr+2)(gb->index) = save_realloc("gb->index", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 972, (gb->index), (gb->nr+2), sizeof(*(gb->index))
)
;
973 srenew(*gn, gb->nr+1)(*gn) = save_realloc("*gn", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 973, (*gn), (gb->nr+1), sizeof(*(*gn)))
;
974 (*gn)[gb->nr] = strdup("Water_and_ions")(__extension__ (__builtin_constant_p ("Water_and_ions") &&
((size_t)(const void *)(("Water_and_ions") + 1) - (size_t)(const
void *)("Water_and_ions") == 1) ? (((const char *) ("Water_and_ions"
))[0] == '\0' ? (char *) calloc ((size_t) 1, (size_t) 1) : ({
size_t __len = strlen ("Water_and_ions") + 1; char *__retval
= (char *) malloc (__len); if (__retval != ((void*)0)) __retval
= (char *) memcpy (__retval, "Water_and_ions", __len); __retval
; })) : __strdup ("Water_and_ions")))
;
975 srenew(gb->a, gb->nra+nwater+nion)(gb->a) = save_realloc("gb->a", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 975, (gb->a), (gb->nra+nwater+nion), sizeof(*(gb->
a)))
;
976 if (nwater > 0)
977 {
978 for (i = gb->index[iwater]; i < gb->index[iwater+1]; i++)
979 {
980 gb->a[gb->nra++] = gb->a[i];
981 }
982 }
983 if (nion > 0)
984 {
985 for (i = gb->index[iion]; i < gb->index[iion+1]; i++)
986 {
987 gb->a[gb->nra++] = gb->a[i];
988 }
989 }
990 gb->nr++;
991 gb->index[gb->nr] = gb->nra;
992 }
993}
994
995
996void check_index(char *gname, int n, atom_id index[], char *traj, int natoms)
997{
998 int i;
999
1000 for (i = 0; i < n; i++)
1001 {
1002 if (index[i] >= natoms)
1003 {
1004 gmx_fatal(FARGS0, "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c",
1004
, "%s atom number (index[%d]=%d) is larger than the number of atoms in %s (%d)",
1005 gname ? gname : "Index", i+1, index[i]+1,
1006 traj ? traj : "the trajectory", natoms);
1007 }
1008 else if (index[i] < 0)
1009 {
1010 gmx_fatal(FARGS0, "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c",
1010
, "%s atom number (index[%d]=%d) is less than zero",
1011 gname ? gname : "Index", i+1, index[i]+1);
1012 }
1013 }
1014}
1015
1016t_blocka *init_index(const char *gfile, char ***grpname)
1017{
1018 FILE *in;
1019 t_blocka *b;
1020 int a, maxentries;
1021 int i, j, ng, nread;
1022 char line[STRLEN4096], *pt, str[STRLEN4096];
1023
1024 in = gmx_fio_fopen(gfile, "r");
1025 snew(b, 1)(b) = save_calloc("b", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 1025, (1), sizeof(*(b)))
;
1026 get_a_line(in, line, STRLEN4096);
1027 if (line[0] == '[')
1
Taking true branch
1028 {
1029 /* new format */
1030 b->nr = 0;
1031 b->index = NULL((void*)0);
1032 b->nra = 0;
1033 b->a = NULL((void*)0);
2
Null pointer value stored to field 'a'
1034 *grpname = NULL((void*)0);
1035 maxentries = 0;
1036 do
5
Loop condition is true. Execution continues on line 1038
8
Loop condition is true. Execution continues on line 1038
1037 {
1038 if (get_header(line, str))
3
Taking true branch
6
Taking true branch
9
Taking false branch
1039 {
1040 b->nr++;
1041 srenew(b->index, b->nr+1)(b->index) = save_realloc("b->index", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 1041, (b->index), (b->nr+1), sizeof(*(b->index)))
;
1042 srenew(*grpname, b->nr)(*grpname) = save_realloc("*grpname", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 1042, (*grpname), (b->nr), sizeof(*(*grpname)))
;
1043 if (b->nr == 1)
4
Taking true branch
7
Taking false branch
1044 {
1045 b->index[0] = 0;
1046 }
1047 b->index[b->nr] = b->index[b->nr-1];
1048 (*grpname)[b->nr-1] = strdup(str)(__extension__ (__builtin_constant_p (str) && ((size_t
)(const void *)((str) + 1) - (size_t)(const void *)(str) == 1
) ? (((const char *) (str))[0] == '\0' ? (char *) calloc ((size_t
) 1, (size_t) 1) : ({ size_t __len = strlen (str) + 1; char *
__retval = (char *) malloc (__len); if (__retval != ((void*)0
)) __retval = (char *) memcpy (__retval, str, __len); __retval
; })) : __strdup (str)))
;
1049 }
1050 else
1051 {
1052 if (b->nr == 0)
10
Taking false branch
1053 {
1054 gmx_fatal(FARGS0, "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c",
1054
, "The first header of your indexfile is invalid");
1055 }
1056 pt = line;
1057 while (sscanf(pt, "%s", str) == 1)
11
Loop condition is true. Entering loop body
1058 {
1059 i = b->index[b->nr];
1060 if (i >= maxentries)
12
Assuming 'i' is < 'maxentries'
13
Taking false branch
1061 {
1062 maxentries += 1024;
1063 srenew(b->a, maxentries)(b->a) = save_realloc("b->a", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 1063, (b->a), (maxentries), sizeof(*(b->a)))
;
1064 }
1065 b->a[i] = strtol(str, NULL((void*)0), 10)-1;
14
Array access (via field 'a') results in a null pointer dereference
1066 b->index[b->nr]++;
1067 (b->nra)++;
1068 pt = strstr(pt, str)+strlen(str);
1069 }
1070 }
1071 }
1072 while (get_a_line(in, line, STRLEN4096));
1073 }
1074 else
1075 {
1076 /* old format */
1077 sscanf(line, "%d%d", &b->nr, &b->nra);
1078 snew(b->index, b->nr+1)(b->index) = save_calloc("b->index", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 1078, (b->nr+1), sizeof(*(b->index)))
;
1079 snew(*grpname, b->nr)(*grpname) = save_calloc("*grpname", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 1079, (b->nr), sizeof(*(*grpname)))
;
1080 b->index[0] = 0;
1081 snew(b->a, b->nra)(b->a) = save_calloc("b->a", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 1081, (b->nra), sizeof(*(b->a)))
;
1082 for (i = 0; (i < b->nr); i++)
1083 {
1084 nread = fscanf(in, "%s%d", str, &ng);
1085 (*grpname)[i] = strdup(str)(__extension__ (__builtin_constant_p (str) && ((size_t
)(const void *)((str) + 1) - (size_t)(const void *)(str) == 1
) ? (((const char *) (str))[0] == '\0' ? (char *) calloc ((size_t
) 1, (size_t) 1) : ({ size_t __len = strlen (str) + 1; char *
__retval = (char *) malloc (__len); if (__retval != ((void*)0
)) __retval = (char *) memcpy (__retval, str, __len); __retval
; })) : __strdup (str)))
;
1086 b->index[i+1] = b->index[i]+ng;
1087 if (b->index[i+1] > b->nra)
1088 {
1089 gmx_fatal(FARGS0, "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c",
1089
, "Something wrong in your indexfile at group %s", str);
1090 }
1091 for (j = 0; (j < ng); j++)
1092 {
1093 nread = fscanf(in, "%d", &a);
1094 b->a[b->index[i]+j] = a;
1095 }
1096 }
1097 }
1098 gmx_fio_fclose(in);
1099
1100 for (i = 0; (i < b->nr); i++)
1101 {
1102 for (j = b->index[i]; (j < b->index[i+1]); j++)
1103 {
1104 if (b->a[j] < 0)
1105 {
1106 fprintf(stderrstderr, "\nWARNING: negative index %d in group %s\n\n",
1107 b->a[j], (*grpname)[i]);
1108 }
1109 }
1110 }
1111
1112 return b;
1113}
1114
1115static void minstring(char *str)
1116{
1117 int i;
1118
1119 for (i = 0; (i < (int)strlen(str)); i++)
1120 {
1121 if (str[i] == '-')
1122 {
1123 str[i] = '_';
1124 }
1125 }
1126}
1127
1128int find_group(char s[], int ngrps, char **grpname)
1129{
1130 int aa, i, n;
1131 char string[STRLEN4096];
1132 gmx_bool bMultiple;
1133
1134 bMultiple = FALSE0;
1135 n = strlen(s);
1136 aa = NOTSET-12345;
1137 /* first look for whole name match */
1138 if (aa == NOTSET-12345)
1139 {
1140 for (i = 0; i < ngrps; i++)
1141 {
1142 if (gmx_strcasecmp_min(s, grpname[i]) == 0)
1143 {
1144 if (aa != NOTSET-12345)
1145 {
1146 bMultiple = TRUE1;
1147 }
1148 aa = i;
1149 }
1150 }
1151 }
1152 /* second look for first string match */
1153 if (aa == NOTSET-12345)
1154 {
1155 for (i = 0; i < ngrps; i++)
1156 {
1157 if (gmx_strncasecmp_min(s, grpname[i], n) == 0)
1158 {
1159 if (aa != NOTSET-12345)
1160 {
1161 bMultiple = TRUE1;
1162 }
1163 aa = i;
1164 }
1165 }
1166 }
1167 /* last look for arbitrary substring match */
1168 if (aa == NOTSET-12345)
1169 {
1170 upstring(s);
1171 minstring(s);
1172 for (i = 0; i < ngrps; i++)
1173 {
1174 strcpy(string, grpname[i]);
1175 upstring(string);
1176 minstring(string);
1177 if (strstr(string, s) != NULL((void*)0))
1178 {
1179 if (aa != NOTSET-12345)
1180 {
1181 bMultiple = TRUE1;
1182 }
1183 aa = i;
1184 }
1185 }
1186 }
1187 if (bMultiple)
1188 {
1189 printf("Error: Multiple groups '%s' selected\n", s);
1190 aa = NOTSET-12345;
1191 }
1192 return aa;
1193}
1194
1195static int qgroup(int *a, int ngrps, char **grpname)
1196{
1197 char s[STRLEN4096];
1198 int aa;
1199 gmx_bool bInRange;
1200 char *end;
1201
1202 do
1203 {
1204 fprintf(stderrstderr, "Select a group: ");
1205 do
1206 {
1207 if (scanf("%s", s) != 1)
1208 {
1209 gmx_fatal(FARGS0, "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c",
1209
, "Cannot read from input");
1210 }
1211 trim(s); /* remove spaces */
1212 }
1213 while (strlen(s) == 0);
1214 aa = strtol(s, &end, 10);
1215 if (aa == 0 && end[0] != '\0') /* string entered */
1216 {
1217 aa = find_group(s, ngrps, grpname);
1218 }
1219 bInRange = (aa >= 0 && aa < ngrps);
1220 if (!bInRange)
1221 {
1222 printf("Error: No such group '%s'\n", s);
1223 }
1224 }
1225 while (!bInRange);
1226 printf("Selected %d: '%s'\n", aa, grpname[aa]);
1227 *a = aa;
1228 return aa;
1229}
1230
1231static void rd_groups(t_blocka *grps, char **grpname, char *gnames[],
1232 int ngrps, int isize[], atom_id *index[], int grpnr[])
1233{
1234 int i, j, gnr1;
1235
1236 if (grps->nr == 0)
1237 {
1238 gmx_fatal(FARGS0, "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c",
1238
, "Error: no groups in indexfile");
1239 }
1240 for (i = 0; (i < grps->nr); i++)
1241 {
1242 fprintf(stderrstderr, "Group %5d (%15s) has %5d elements\n", i, grpname[i],
1243 grps->index[i+1]-grps->index[i]);
1244 }
1245 for (i = 0; (i < ngrps); i++)
1246 {
1247 if (grps->nr > 1)
1248 {
1249 do
1250 {
1251 gnr1 = qgroup(&grpnr[i], grps->nr, grpname);
1252 if ((gnr1 < 0) || (gnr1 >= grps->nr))
1253 {
1254 fprintf(stderrstderr, "Select between %d and %d.\n", 0, grps->nr-1);
1255 }
1256 }
1257 while ((gnr1 < 0) || (gnr1 >= grps->nr));
1258 }
1259 else
1260 {
1261 fprintf(stderrstderr, "There is one group in the index\n");
1262 gnr1 = 0;
1263 }
1264 gnames[i] = strdup(grpname[gnr1])(__extension__ (__builtin_constant_p (grpname[gnr1]) &&
((size_t)(const void *)((grpname[gnr1]) + 1) - (size_t)(const
void *)(grpname[gnr1]) == 1) ? (((const char *) (grpname[gnr1
]))[0] == '\0' ? (char *) calloc ((size_t) 1, (size_t) 1) : (
{ size_t __len = strlen (grpname[gnr1]) + 1; char *__retval =
(char *) malloc (__len); if (__retval != ((void*)0)) __retval
= (char *) memcpy (__retval, grpname[gnr1], __len); __retval
; })) : __strdup (grpname[gnr1])))
;
1265 isize[i] = grps->index[gnr1+1]-grps->index[gnr1];
1266 snew(index[i], isize[i])(index[i]) = save_calloc("index[i]", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 1266, (isize[i]), sizeof(*(index[i])))
;
1267 for (j = 0; (j < isize[i]); j++)
1268 {
1269 index[i][j] = grps->a[grps->index[gnr1]+j];
1270 }
1271 }
1272}
1273
1274void rd_index(const char *statfile, int ngrps, int isize[],
1275 atom_id *index[], char *grpnames[])
1276{
1277 char **gnames;
1278 t_blocka *grps;
1279 int *grpnr;
1280
1281 snew(grpnr, ngrps)(grpnr) = save_calloc("grpnr", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 1281, (ngrps), sizeof(*(grpnr)))
;
1282 if (!statfile)
1283 {
1284 gmx_fatal(FARGS0, "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c",
1284
, "No index file specified");
1285 }
1286 grps = init_index(statfile, &gnames);
1287 rd_groups(grps, gnames, grpnames, ngrps, isize, index, grpnr);
1288}
1289
1290void rd_index_nrs(char *statfile, int ngrps, int isize[],
1291 atom_id *index[], char *grpnames[], int grpnr[])
1292{
1293 char **gnames;
1294 t_blocka *grps;
1295
1296 if (!statfile)
1297 {
1298 gmx_fatal(FARGS0, "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c",
1298
, "No index file specified");
1299 }
1300 grps = init_index(statfile, &gnames);
1301
1302 rd_groups(grps, gnames, grpnames, ngrps, isize, index, grpnr);
1303}
1304
1305void get_index(t_atoms *atoms, const char *fnm, int ngrps,
1306 int isize[], atom_id *index[], char *grpnames[])
1307{
1308 char ***gnames;
1309 t_blocka *grps = NULL((void*)0);
1310 int *grpnr;
1311
1312 snew(grpnr, ngrps)(grpnr) = save_calloc("grpnr", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 1312, (ngrps), sizeof(*(grpnr)))
;
1313 snew(gnames, 1)(gnames) = save_calloc("gnames", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 1313, (1), sizeof(*(gnames)))
;
1314 if (fnm != NULL((void*)0))
1315 {
1316 grps = init_index(fnm, gnames);
1317 }
1318 else if (atoms)
1319 {
1320 snew(grps, 1)(grps) = save_calloc("grps", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 1320, (1), sizeof(*(grps)))
;
1321 snew(grps->index, 1)(grps->index) = save_calloc("grps->index", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 1321, (1), sizeof(*(grps->index)))
;
1322 analyse(atoms, grps, gnames, FALSE0, FALSE0);
1323 }
1324 else
1325 {
1326 gmx_incons("You need to supply a valid atoms structure or a valid index file name")_gmx_error("incons", "You need to supply a valid atoms structure or a valid index file name"
, "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c", 1326
)
;
1327 }
1328
1329 rd_groups(grps, *gnames, grpnames, ngrps, isize, index, grpnr);
1330}
1331
1332t_cluster_ndx *cluster_index(FILE *fplog, const char *ndx)
1333{
1334 t_cluster_ndx *c;
1335 int i;
1336
1337 snew(c, 1)(c) = save_calloc("c", "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c"
, 1337, (1), sizeof(*(c)))
;
1338 c->clust = init_index(ndx, &c->grpname);
1339 c->maxframe = -1;
1340 for (i = 0; (i < c->clust->nra); i++)
1341 {
1342 c->maxframe = max(c->maxframe, c->clust->a[i])(((c->maxframe) > (c->clust->a[i])) ? (c->maxframe
) : (c->clust->a[i]) )
;
1343 }
1344 fprintf(fplog ? fplog : stdoutstdout,
1345 "There are %d clusters containing %d structures, highest framenr is %d\n",
1346 c->clust->nr, c->clust->nra, c->maxframe);
1347 if (debug)
1348 {
1349 pr_blocka(debug, 0, "clust", c->clust, TRUE1);
1350 for (i = 0; (i < c->clust->nra); i++)
1351 {
1352 if ((c->clust->a[i] < 0) || (c->clust->a[i] > c->maxframe))
1353 {
1354 gmx_fatal(FARGS0, "/home/alexxy/Develop/gromacs/src/gromacs/gmxlib/index.c",
1354
, "Range check error for c->clust->a[%d] = %d\n"
1355 "should be within 0 and %d", i, c->clust->a[i], c->maxframe+1);
1356 }
1357 }
1358 }
1359 c->inv_clust = make_invblocka(c->clust, c->maxframe);
1360
1361 return c;
1362}