Code beautification with uncrustify
[alexxy/gromacs.git] / src / tools / gmx_make_ndx.c
index d2d7141a8409f2e06a1b6973dc062da1dda88aea..1cb884fcfdbc73f467c2ead0eba062b7b0448174 100644 (file)
@@ -1,11 +1,11 @@
 /*
- * 
+ *
  *                This source code is part of
- * 
+ *
  *                 G   R   O   M   A   C   S
- * 
+ *
  *          GROningen MAchine for Chemical Simulations
- * 
+ *
  *                        VERSION 3.2.0
  * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * modify it under the terms of the GNU General Public License
  * as published by the Free Software Foundation; either version 2
  * of the License, or (at your option) any later version.
- * 
+ *
  * If you want to redistribute modifications, please consider that
  * scientific software is very special. Version control is crucial -
  * bugs must be traceable. We will be happy to consider code for
  * inclusion in the official distribution, but derived work must not
  * be called official GROMACS. Details are found in the README & COPYING
  * files - if they are missing, get the official version at www.gromacs.org.
- * 
+ *
  * To help us fund GROMACS development, we humbly ask that you cite
  * the papers on the package - you can find them in the top README file.
- * 
+ *
  * For more info, check our website at http://www.gromacs.org
- * 
+ *
  * And Hey:
  * Green Red Orange Magenta Azure Cyan Skyblue
  */
 #define MAXNAMES 30
 #define NAME_LEN 30
 
-gmx_bool bCase=FALSE;
+gmx_bool bCase = FALSE;
 
-static int or_groups(atom_id nr1,atom_id *at1,atom_id nr2,atom_id *at2,
-                    atom_id *nr,atom_id *at)
+static int or_groups(atom_id nr1, atom_id *at1, atom_id nr2, atom_id *at2,
+                     atom_id *nr, atom_id *at)
 {
-  atom_id i1,i2,max=0;
-  gmx_bool bNotIncr;
-
-  *nr=0;
-  
-  bNotIncr=FALSE;
-  for(i1=0; i1<nr1; i1++) {
-    if ((i1>0) && (at1[i1] <= max))
-      bNotIncr=TRUE;
-    max=at1[i1];
-  }
-  for(i1=0; i1<nr2; i1++) {
-    if ((i1>0) && (at2[i1] <= max))
-      bNotIncr=TRUE;
-    max=at2[i1];
-  }
-
-  if (bNotIncr)
-    printf("One of your groups is not ascending\n");
-  else {
-    i1=0;
-    i2=0;
-    *nr=0;
-    while ((i1 < nr1) || (i2 < nr2)) {
-      if ((i2 == nr2) || ((i1<nr1) && (at1[i1] < at2[i2]))) {
-       at[*nr]=at1[i1];
-       (*nr)++;
-       i1++;
-      }
-      else {
-       if ((i2<nr2) && ((i1==nr1) || (at1[i1] > at2[i2]))) {
-         at[*nr]=at2[i2];
-         (*nr)++;
-       }
-       i2++;
-      }
-    }
-    
-    printf("Merged two groups with OR: %u %u -> %u\n",nr1,nr2,*nr);
-  }
-
-  return *nr;
+    atom_id  i1, i2, max = 0;
+    gmx_bool bNotIncr;
+
+    *nr = 0;
+
+    bNotIncr = FALSE;
+    for (i1 = 0; i1 < nr1; i1++)
+    {
+        if ((i1 > 0) && (at1[i1] <= max))
+        {
+            bNotIncr = TRUE;
+        }
+        max = at1[i1];
+    }
+    for (i1 = 0; i1 < nr2; i1++)
+    {
+        if ((i1 > 0) && (at2[i1] <= max))
+        {
+            bNotIncr = TRUE;
+        }
+        max = at2[i1];
+    }
+
+    if (bNotIncr)
+    {
+        printf("One of your groups is not ascending\n");
+    }
+    else
+    {
+        i1  = 0;
+        i2  = 0;
+        *nr = 0;
+        while ((i1 < nr1) || (i2 < nr2))
+        {
+            if ((i2 == nr2) || ((i1 < nr1) && (at1[i1] < at2[i2])))
+            {
+                at[*nr] = at1[i1];
+                (*nr)++;
+                i1++;
+            }
+            else
+            {
+                if ((i2 < nr2) && ((i1 == nr1) || (at1[i1] > at2[i2])))
+                {
+                    at[*nr] = at2[i2];
+                    (*nr)++;
+                }
+                i2++;
+            }
+        }
+
+        printf("Merged two groups with OR: %u %u -> %u\n", nr1, nr2, *nr);
+    }
+
+    return *nr;
 }
 
-static int and_groups(atom_id nr1,atom_id *at1,atom_id nr2,atom_id *at2,
-                     atom_id *nr,atom_id *at)
+static int and_groups(atom_id nr1, atom_id *at1, atom_id nr2, atom_id *at2,
+                      atom_id *nr, atom_id *at)
 {
-  atom_id i1,i2;
-  
-  *nr=0;
-  for (i1=0; i1<nr1; i1++) {
-    for (i2=0; i2<nr2; i2++) {
-      if (at1[i1]==at2[i2]) {
-       at[*nr]=at1[i1];
-       (*nr)++;
-      }
+    atom_id i1, i2;
+
+    *nr = 0;
+    for (i1 = 0; i1 < nr1; i1++)
+    {
+        for (i2 = 0; i2 < nr2; i2++)
+        {
+            if (at1[i1] == at2[i2])
+            {
+                at[*nr] = at1[i1];
+                (*nr)++;
+            }
+        }
     }
-  }
 
-  printf("Merged two groups with AND: %u %u -> %u\n",nr1,nr2,*nr);
+    printf("Merged two groups with AND: %u %u -> %u\n", nr1, nr2, *nr);
 
-  return *nr;
+    return *nr;
 }
 
 static gmx_bool is_name_char(char c)
 {
-  /* This string should contain all characters that can not be
-   * the first letter of a name due to the make_ndx syntax.
-   */
-  const char *spec=" !&|";
+    /* This string should contain all characters that can not be
+     * the first letter of a name due to the make_ndx syntax.
+     */
+    const char *spec = " !&|";
 
-  return (c != '\0' && strchr(spec,c) == NULL);
+    return (c != '\0' && strchr(spec, c) == NULL);
 }
 
-static int parse_names(char **string,int *n_names,char **names)
+static int parse_names(char **string, int *n_names, char **names)
 {
-  int i;
-  
-  *n_names=0;
-  while (is_name_char((*string)[0]) || (*string)[0] == ' ') {
-    if (is_name_char((*string)[0])) {
-      if (*n_names >= MAXNAMES) 
-       gmx_fatal(FARGS,"To many names: %d\n",*n_names+1);
-      i=0;
-      while (is_name_char((*string)[i])) {
-       names[*n_names][i]=(*string)[i];
-       i++;
-       if (i > NAME_LEN) {
-         printf("Name is too long, the maximum is %d characters\n",NAME_LEN);
-         return 0;
-       }
-      }
-      names[*n_names][i]='\0';
-      if (!bCase)
-       upstring(names[*n_names]);
-      *string += i;
-      (*n_names)++;
+    int i;
+
+    *n_names = 0;
+    while (is_name_char((*string)[0]) || (*string)[0] == ' ')
+    {
+        if (is_name_char((*string)[0]))
+        {
+            if (*n_names >= MAXNAMES)
+            {
+                gmx_fatal(FARGS, "To many names: %d\n", *n_names+1);
+            }
+            i = 0;
+            while (is_name_char((*string)[i]))
+            {
+                names[*n_names][i] = (*string)[i];
+                i++;
+                if (i > NAME_LEN)
+                {
+                    printf("Name is too long, the maximum is %d characters\n", NAME_LEN);
+                    return 0;
+                }
+            }
+            names[*n_names][i] = '\0';
+            if (!bCase)
+            {
+                upstring(names[*n_names]);
+            }
+            *string += i;
+            (*n_names)++;
+        }
+        else
+        {
+            (*string)++;
+        }
     }
-    else
-      (*string)++;
-  }  
 
-  return *n_names;
+    return *n_names;
 }
 
-static gmx_bool parse_int_char(char **string,int *nr,char *c)
+static gmx_bool parse_int_char(char **string, int *nr, char *c)
 {
-  char *orig;
-  gmx_bool bRet;
+    char    *orig;
+    gmx_bool bRet;
 
-  orig = *string;
+    orig = *string;
 
-  while ((*string)[0]==' ')
-    (*string)++;
+    while ((*string)[0] == ' ')
+    {
+        (*string)++;
+    }
 
-  bRet=FALSE;
+    bRet = FALSE;
 
-  *c = ' ';
+    *c = ' ';
 
-  if (isdigit((*string)[0])) {
-    *nr=(*string)[0]-'0';
-    (*string)++;
-    while (isdigit((*string)[0])) {
-      *nr = (*nr)*10+(*string)[0]-'0';
-      (*string)++;
-    }
-    if (isalpha((*string)[0])) {
-      *c = (*string)[0];
-      (*string)++;
+    if (isdigit((*string)[0]))
+    {
+        *nr = (*string)[0]-'0';
+        (*string)++;
+        while (isdigit((*string)[0]))
+        {
+            *nr = (*nr)*10+(*string)[0]-'0';
+            (*string)++;
+        }
+        if (isalpha((*string)[0]))
+        {
+            *c = (*string)[0];
+            (*string)++;
+        }
+        /* Check if there is at most one non-digit character */
+        if (!isalnum((*string)[0]))
+        {
+            bRet = TRUE;
+        }
+        else
+        {
+            *string = orig;
+        }
     }
-    /* Check if there is at most one non-digit character */
-    if (!isalnum((*string)[0])) {
-      bRet = TRUE;
-    } else {
-      *string = orig;
+    else
+    {
+        *nr = NOTSET;
     }
-  }
-  else
-    *nr=NOTSET;
 
-  return bRet;
+    return bRet;
 }
 
-static gmx_bool parse_int(char **string,int *nr)
+static gmx_bool parse_int(char **string, int *nr)
 {
-  char *orig,c;
-  gmx_bool bRet;
+    char    *orig, c;
+    gmx_bool bRet;
 
-  orig = *string;
-  bRet = parse_int_char(string,nr,&c);
-  if (bRet && c != ' ') {
-    *string = orig;
-    bRet = FALSE;
-  }
+    orig = *string;
+    bRet = parse_int_char(string, nr, &c);
+    if (bRet && c != ' ')
+    {
+        *string = orig;
+        bRet    = FALSE;
+    }
 
-  return bRet;
+    return bRet;
 }
 
 static gmx_bool isquote(char c)
 {
-  return (c == '\"');
+    return (c == '\"');
 }
 
-static gmx_bool parse_string(char **string,int *nr, int ngrps, char **grpname)
+static gmx_bool parse_string(char **string, int *nr, int ngrps, char **grpname)
 {
-  char *s, *sp;
-  char c;
-  
-  while ((*string)[0]==' ')
-    (*string)++;
-
-  (*nr) = NOTSET;
-  if (isquote((*string)[0])) {
-    c=(*string)[0];
-    (*string)++;
-    s = strdup((*string));
-    sp = strchr(s, c);
-    if (sp!=NULL) {
-      (*string) += sp-s + 1;
-      sp[0]='\0';
-      (*nr) = find_group(s, ngrps, grpname);
-    }
-  }
-  
-  return (*nr) != NOTSET;
+    char *s, *sp;
+    char  c;
+
+    while ((*string)[0] == ' ')
+    {
+        (*string)++;
+    }
+
+    (*nr) = NOTSET;
+    if (isquote((*string)[0]))
+    {
+        c = (*string)[0];
+        (*string)++;
+        s  = strdup((*string));
+        sp = strchr(s, c);
+        if (sp != NULL)
+        {
+            (*string) += sp-s + 1;
+            sp[0]      = '\0';
+            (*nr)      = find_group(s, ngrps, grpname);
+        }
+    }
+
+    return (*nr) != NOTSET;
 }
 
-static int select_atomnumbers(char **string,t_atoms *atoms,atom_id n1,
-                             atom_id *nr,atom_id *index,char *gname)
+static int select_atomnumbers(char **string, t_atoms *atoms, atom_id n1,
+                              atom_id *nr, atom_id *index, char *gname)
 {
-  char    buf[STRLEN];
-  int     i,up;
-
-  *nr=0;
-  while ((*string)[0]==' ')
-    (*string)++;
-  if ((*string)[0]=='-') {
-    (*string)++;
-    parse_int(string,&up);
-    if ((n1<1) || (n1>atoms->nr) || (up<1) || (up>atoms->nr))
-      printf("Invalid atom range\n");
-    else {
-      for(i=n1-1; i<=up-1; i++) {
-       index[*nr]=i;
-       (*nr)++;
-      }  
-      printf("Found %u atom%s in range %u-%d\n",*nr,(*nr==1)?"":"s",n1,up);
-      if (n1==up)
-       sprintf(buf,"a_%u",n1);
-      else
-       sprintf(buf,"a_%u-%d",n1,up);
-      strcpy(gname,buf);
-    }
-  }
-  else {
-    i=n1;
-    sprintf(gname,"a");
-    do {
-      if ((i-1>=0) && (i-1<atoms->nr)) {
-       index[*nr] = i-1;
-       (*nr)++;
-       sprintf(buf,"_%d",i);
-       strcat(gname,buf);
-      } else {
-       printf("Invalid atom number %d\n",i);
-       *nr = 0;
-      }
-    } while ((*nr!=0) && (parse_int(string,&i)));
-  }
-  
-  return *nr;
+    char    buf[STRLEN];
+    int     i, up;
+
+    *nr = 0;
+    while ((*string)[0] == ' ')
+    {
+        (*string)++;
+    }
+    if ((*string)[0] == '-')
+    {
+        (*string)++;
+        parse_int(string, &up);
+        if ((n1 < 1) || (n1 > atoms->nr) || (up < 1) || (up > atoms->nr))
+        {
+            printf("Invalid atom range\n");
+        }
+        else
+        {
+            for (i = n1-1; i <= up-1; i++)
+            {
+                index[*nr] = i;
+                (*nr)++;
+            }
+            printf("Found %u atom%s in range %u-%d\n", *nr, (*nr == 1) ? "" : "s", n1, up);
+            if (n1 == up)
+            {
+                sprintf(buf, "a_%u", n1);
+            }
+            else
+            {
+                sprintf(buf, "a_%u-%d", n1, up);
+            }
+            strcpy(gname, buf);
+        }
+    }
+    else
+    {
+        i = n1;
+        sprintf(gname, "a");
+        do
+        {
+            if ((i-1 >= 0) && (i-1 < atoms->nr))
+            {
+                index[*nr] = i-1;
+                (*nr)++;
+                sprintf(buf, "_%d", i);
+                strcat(gname, buf);
+            }
+            else
+            {
+                printf("Invalid atom number %d\n", i);
+                *nr = 0;
+            }
+        }
+        while ((*nr != 0) && (parse_int(string, &i)));
+    }
+
+    return *nr;
 }
 
-static int select_residuenumbers(char **string,t_atoms *atoms,
-                                atom_id n1,char c,
-                                atom_id *nr,atom_id *index,char *gname)
+static int select_residuenumbers(char **string, t_atoms *atoms,
+                                 atom_id n1, char c,
+                                 atom_id *nr, atom_id *index, char *gname)
 {
-  char    buf[STRLEN];
-  int     i,j,up;
-  t_resinfo *ri;
-
-  *nr=0;
-  while ((*string)[0]==' ')
-    (*string)++;
-  if ((*string)[0]=='-') {
-    /* Residue number range selection */
-    if (c != ' ') {
-      printf("Error: residue insertion codes can not be used with residue range selection\n");
-      return 0;
-    }
-    (*string)++;
-    parse_int(string,&up);
-
-    for(i=0; i<atoms->nr; i++) {
-      ri = &atoms->resinfo[atoms->atom[i].resind];
-      for(j=n1; (j<=up); j++) {
-       if (ri->nr == j && (c == ' ' || ri->ic == c)) {
-         index[*nr]=i;
-         (*nr)++;
-       }
-      }
-    }
-    printf("Found %u atom%s with res.nr. in range %u-%d\n",
-          *nr,(*nr==1)?"":"s",n1,up);
-    if (n1==up)
-      sprintf(buf,"r_%u",n1);
+    char       buf[STRLEN];
+    int        i, j, up;
+    t_resinfo *ri;
+
+    *nr = 0;
+    while ((*string)[0] == ' ')
+    {
+        (*string)++;
+    }
+    if ((*string)[0] == '-')
+    {
+        /* Residue number range selection */
+        if (c != ' ')
+        {
+            printf("Error: residue insertion codes can not be used with residue range selection\n");
+            return 0;
+        }
+        (*string)++;
+        parse_int(string, &up);
+
+        for (i = 0; i < atoms->nr; i++)
+        {
+            ri = &atoms->resinfo[atoms->atom[i].resind];
+            for (j = n1; (j <= up); j++)
+            {
+                if (ri->nr == j && (c == ' ' || ri->ic == c))
+                {
+                    index[*nr] = i;
+                    (*nr)++;
+                }
+            }
+        }
+        printf("Found %u atom%s with res.nr. in range %u-%d\n",
+               *nr, (*nr == 1) ? "" : "s", n1, up);
+        if (n1 == up)
+        {
+            sprintf(buf, "r_%u", n1);
+        }
+        else
+        {
+            sprintf(buf, "r_%u-%d", n1, up);
+        }
+        strcpy(gname, buf);
+    }
     else
-      sprintf(buf,"r_%u-%d",n1,up);
-    strcpy(gname,buf);
-  }
-  else {
-    /* Individual residue number/insertion code selection */
-    j=n1;
-    sprintf(gname,"r");
-    do {
-      for(i=0; i<atoms->nr; i++) {
-       ri = &atoms->resinfo[atoms->atom[i].resind];
-       if (ri->nr == j && ri->ic == c) {
-       index[*nr]=i;
-       (*nr)++;
-       }
-      }
-      sprintf(buf,"_%d",j);
-      strcat(gname,buf);
-    } while (parse_int_char(string,&j,&c));
-  }
-  
-  return *nr;
+    {
+        /* Individual residue number/insertion code selection */
+        j = n1;
+        sprintf(gname, "r");
+        do
+        {
+            for (i = 0; i < atoms->nr; i++)
+            {
+                ri = &atoms->resinfo[atoms->atom[i].resind];
+                if (ri->nr == j && ri->ic == c)
+                {
+                    index[*nr] = i;
+                    (*nr)++;
+                }
+            }
+            sprintf(buf, "_%d", j);
+            strcat(gname, buf);
+        }
+        while (parse_int_char(string, &j, &c));
+    }
+
+    return *nr;
 }
 
-static int select_residueindices(char **string,t_atoms *atoms,
-                                atom_id n1,char c,
-                                atom_id *nr,atom_id *index,char *gname)
+static int select_residueindices(char **string, t_atoms *atoms,
+                                 atom_id n1, char c,
+                                 atom_id *nr, atom_id *index, char *gname)
 {
-  /*this should be similar to select_residuenumbers except select by index (sequential numbering in file)*/
-  /*resind+1 for 1-indexing*/
-  char    buf[STRLEN];
-  int     i,j,up;
-  t_resinfo *ri;
-
-  *nr=0;
-  while ((*string)[0]==' ')
-    (*string)++;
-  if ((*string)[0]=='-') {
-    /* Residue number range selection */
-    if (c != ' ') {
-      printf("Error: residue insertion codes can not be used with residue range selection\n");
-      return 0;
-    }
-    (*string)++;
-    parse_int(string,&up);
-
-    for(i=0; i<atoms->nr; i++) {
-      ri = &atoms->resinfo[atoms->atom[i].resind];
-      for(j=n1; (j<=up); j++) {
-       if (atoms->atom[i].resind+1 == j && (c == ' ' || ri->ic == c)) {
-         index[*nr]=i;
-         (*nr)++;
-       }
-      }
-    }
-    printf("Found %u atom%s with resind.+1 in range %u-%d\n",
-          *nr,(*nr==1)?"":"s",n1,up);
-    if (n1==up)
-      sprintf(buf,"r_%u",n1);
+    /*this should be similar to select_residuenumbers except select by index (sequential numbering in file)*/
+    /*resind+1 for 1-indexing*/
+    char       buf[STRLEN];
+    int        i, j, up;
+    t_resinfo *ri;
+
+    *nr = 0;
+    while ((*string)[0] == ' ')
+    {
+        (*string)++;
+    }
+    if ((*string)[0] == '-')
+    {
+        /* Residue number range selection */
+        if (c != ' ')
+        {
+            printf("Error: residue insertion codes can not be used with residue range selection\n");
+            return 0;
+        }
+        (*string)++;
+        parse_int(string, &up);
+
+        for (i = 0; i < atoms->nr; i++)
+        {
+            ri = &atoms->resinfo[atoms->atom[i].resind];
+            for (j = n1; (j <= up); j++)
+            {
+                if (atoms->atom[i].resind+1 == j && (c == ' ' || ri->ic == c))
+                {
+                    index[*nr] = i;
+                    (*nr)++;
+                }
+            }
+        }
+        printf("Found %u atom%s with resind.+1 in range %u-%d\n",
+               *nr, (*nr == 1) ? "" : "s", n1, up);
+        if (n1 == up)
+        {
+            sprintf(buf, "r_%u", n1);
+        }
+        else
+        {
+            sprintf(buf, "r_%u-%d", n1, up);
+        }
+        strcpy(gname, buf);
+    }
     else
-      sprintf(buf,"r_%u-%d",n1,up);
-    strcpy(gname,buf);
-  }
-  else {
-    /* Individual residue number/insertion code selection */
-    j=n1;
-    sprintf(gname,"r");
-    do {
-      for(i=0; i<atoms->nr; i++) {
-       ri = &atoms->resinfo[atoms->atom[i].resind];
-       if (atoms->atom[i].resind+1 == j && ri->ic == c) {
-       index[*nr]=i;
-       (*nr)++;
-       }
-      }
-      sprintf(buf,"_%d",j);
-      strcat(gname,buf);
-    } while (parse_int_char(string,&j,&c));
-  }
-  
-  return *nr;
+    {
+        /* Individual residue number/insertion code selection */
+        j = n1;
+        sprintf(gname, "r");
+        do
+        {
+            for (i = 0; i < atoms->nr; i++)
+            {
+                ri = &atoms->resinfo[atoms->atom[i].resind];
+                if (atoms->atom[i].resind+1 == j && ri->ic == c)
+                {
+                    index[*nr] = i;
+                    (*nr)++;
+                }
+            }
+            sprintf(buf, "_%d", j);
+            strcat(gname, buf);
+        }
+        while (parse_int_char(string, &j, &c));
+    }
+
+    return *nr;
 }
 
 
-static gmx_bool atoms_from_residuenumbers(t_atoms *atoms,int group,t_blocka *block,
-                                     atom_id *nr,atom_id *index,char *gname)
+static gmx_bool atoms_from_residuenumbers(t_atoms *atoms, int group, t_blocka *block,
+                                          atom_id *nr, atom_id *index, char *gname)
 {
-  int i,j,j0,j1,resnr,nres;
-  
-  j0=block->index[group];
-  j1=block->index[group+1];
-  nres = atoms->nres;
-  for(j=j0; j<j1; j++)
-    if (block->a[j]>=nres) {
-      printf("Index %s contains number>nres (%d>%d)\n",
-            gname,block->a[j]+1,nres);
-      return FALSE;
-    }
-  for(i=0; i<atoms->nr; i++) {
-    resnr = atoms->resinfo[atoms->atom[i].resind].nr;
-    for (j=j0; j<j1; j++)
-      if (block->a[j]+1 == resnr) {
-       index[*nr]=i;
-       (*nr)++;
-       break;
-      }
-  }
-  printf("Found %u atom%s in %d residues from group %s\n",
-        *nr,(*nr==1)?"":"s",j1-j0,gname);
-  return *nr;
+    int i, j, j0, j1, resnr, nres;
+
+    j0   = block->index[group];
+    j1   = block->index[group+1];
+    nres = atoms->nres;
+    for (j = j0; j < j1; j++)
+    {
+        if (block->a[j] >= nres)
+        {
+            printf("Index %s contains number>nres (%d>%d)\n",
+                   gname, block->a[j]+1, nres);
+            return FALSE;
+        }
+    }
+    for (i = 0; i < atoms->nr; i++)
+    {
+        resnr = atoms->resinfo[atoms->atom[i].resind].nr;
+        for (j = j0; j < j1; j++)
+        {
+            if (block->a[j]+1 == resnr)
+            {
+                index[*nr] = i;
+                (*nr)++;
+                break;
+            }
+        }
+    }
+    printf("Found %u atom%s in %d residues from group %s\n",
+           *nr, (*nr == 1) ? "" : "s", j1-j0, gname);
+    return *nr;
 }
 
-static gmx_bool comp_name(char *name,char *search)
+static gmx_bool comp_name(char *name, char *search)
 {
-  while (name[0] != '\0' && search[0] != '\0') {
-    switch (search[0]) {
-    case '?':
-      /* Always matches */
-      break;
-    case '*':
-      if (search[1] != '\0') {
-       printf("WARNING: Currently '*' is only supported at the end of an expression\n");
-       return FALSE;
-      } else {
-       return TRUE;
-      }
-      break;
-    default:
-      /* Compare a single character */
-      if (( bCase && strncmp(name,search,1)) ||
-         (!bCase && gmx_strncasecmp(name,search,1))) {
-       return FALSE;
-      }
-    }
-    name++;
-    search++;
-  }
-
-  return (name[0] == '\0' && (search[0] == '\0' || search[0] == '*'));
+    while (name[0] != '\0' && search[0] != '\0')
+    {
+        switch (search[0])
+        {
+            case '?':
+                /* Always matches */
+                break;
+            case '*':
+                if (search[1] != '\0')
+                {
+                    printf("WARNING: Currently '*' is only supported at the end of an expression\n");
+                    return FALSE;
+                }
+                else
+                {
+                    return TRUE;
+                }
+                break;
+            default:
+                /* Compare a single character */
+                if (( bCase && strncmp(name, search, 1)) ||
+                    (!bCase && gmx_strncasecmp(name, search, 1)))
+                {
+                    return FALSE;
+                }
+        }
+        name++;
+        search++;
+    }
+
+    return (name[0] == '\0' && (search[0] == '\0' || search[0] == '*'));
 }
 
-static int select_chainnames(t_atoms *atoms,int n_names,char **names,
-                            atom_id *nr,atom_id *index)
+static int select_chainnames(t_atoms *atoms, int n_names, char **names,
+                             atom_id *nr, atom_id *index)
 {
-  char name[2];
-  int j;
-  atom_id i;
-  
-  name[1]=0;
-  *nr=0;
-  for(i=0; i<atoms->nr; i++) {
-    name[0] = atoms->resinfo[atoms->atom[i].resind].chainid;
-    j=0; 
-    while (j<n_names && !comp_name(name,names[j])) 
-      j++;
-    if (j<n_names) {
-      index[*nr]=i;
-      (*nr)++;
-    }
-  }
-  printf("Found %u atom%s with chain identifier%s",
-        *nr,(*nr==1)?"":"s",(n_names==1)?"":"s");
-  for(j=0; (j<n_names); j++)
-    printf(" %s",names[j]);
-  printf("\n");
-
-  return *nr;
+    char    name[2];
+    int     j;
+    atom_id i;
+
+    name[1] = 0;
+    *nr     = 0;
+    for (i = 0; i < atoms->nr; i++)
+    {
+        name[0] = atoms->resinfo[atoms->atom[i].resind].chainid;
+        j       = 0;
+        while (j < n_names && !comp_name(name, names[j]))
+        {
+            j++;
+        }
+        if (j < n_names)
+        {
+            index[*nr] = i;
+            (*nr)++;
+        }
+    }
+    printf("Found %u atom%s with chain identifier%s",
+           *nr, (*nr == 1) ? "" : "s", (n_names == 1) ? "" : "s");
+    for (j = 0; (j < n_names); j++)
+    {
+        printf(" %s", names[j]);
+    }
+    printf("\n");
+
+    return *nr;
 }
 
-static int select_atomnames(t_atoms *atoms,int n_names,char **names,
-                           atom_id *nr,atom_id *index,gmx_bool bType)
+static int select_atomnames(t_atoms *atoms, int n_names, char **names,
+                            atom_id *nr, atom_id *index, gmx_bool bType)
 {
-  char *name;
-  int j;
-  atom_id i;
-  
-  *nr=0;
-  for(i=0; i<atoms->nr; i++) {
-    if (bType)
-      name=*(atoms->atomtype[i]);
-    else
-      name=*(atoms->atomname[i]);
-    j=0; 
-    while (j<n_names && !comp_name(name,names[j])) 
-      j++;
-    if (j<n_names) {
-      index[*nr]=i;
-      (*nr)++;
-    }
-  }
-  printf("Found %u atoms with %s%s",
-        *nr,bType ? "type" : "name",(n_names==1)?"":"s");
-  for(j=0; (j<n_names); j++)
-    printf(" %s",names[j]);
-  printf("\n");
-
-  return *nr;
+    char   *name;
+    int     j;
+    atom_id i;
+
+    *nr = 0;
+    for (i = 0; i < atoms->nr; i++)
+    {
+        if (bType)
+        {
+            name = *(atoms->atomtype[i]);
+        }
+        else
+        {
+            name = *(atoms->atomname[i]);
+        }
+        j = 0;
+        while (j < n_names && !comp_name(name, names[j]))
+        {
+            j++;
+        }
+        if (j < n_names)
+        {
+            index[*nr] = i;
+            (*nr)++;
+        }
+    }
+    printf("Found %u atoms with %s%s",
+           *nr, bType ? "type" : "name", (n_names == 1) ? "" : "s");
+    for (j = 0; (j < n_names); j++)
+    {
+        printf(" %s", names[j]);
+    }
+    printf("\n");
+
+    return *nr;
 }
 
-static int select_residuenames(t_atoms *atoms,int n_names,char **names,
-                              atom_id *nr,atom_id *index)
+static int select_residuenames(t_atoms *atoms, int n_names, char **names,
+                               atom_id *nr, atom_id *index)
 {
-  char *name;
-  int j;
-  atom_id i;
-
-  *nr=0;
-  for(i=0; i<atoms->nr; i++) {
-    name = *(atoms->resinfo[atoms->atom[i].resind].name);
-    j=0; 
-    while (j<n_names && !comp_name(name,names[j])) 
-      j++;
-    if (j<n_names) {
-      index[*nr]=i;
-      (*nr)++;
-    }
-  }
-  printf("Found %u atoms with residue name%s",*nr,(n_names==1)?"":"s");
-  for(j=0; (j<n_names); j++)
-    printf(" %s",names[j]);
-  printf("\n");
-
-  return *nr;
+    char   *name;
+    int     j;
+    atom_id i;
+
+    *nr = 0;
+    for (i = 0; i < atoms->nr; i++)
+    {
+        name = *(atoms->resinfo[atoms->atom[i].resind].name);
+        j    = 0;
+        while (j < n_names && !comp_name(name, names[j]))
+        {
+            j++;
+        }
+        if (j < n_names)
+        {
+            index[*nr] = i;
+            (*nr)++;
+        }
+    }
+    printf("Found %u atoms with residue name%s", *nr, (n_names == 1) ? "" : "s");
+    for (j = 0; (j < n_names); j++)
+    {
+        printf(" %s", names[j]);
+    }
+    printf("\n");
+
+    return *nr;
 }
 
-static void copy2block(int n,atom_id *index,t_blocka *block)
+static void copy2block(int n, atom_id *index, t_blocka *block)
 {
-  int i,n0;
-
-  block->nr++;
-  n0=block->nra;
-  block->nra=n0+n;
-  srenew(block->index,block->nr+1);
-  block->index[block->nr]=n0+n;
-  srenew(block->a,n0+n);
-  for(i=0; (i<n); i++)
-    block->a[n0+i]=index[i];
+    int i, n0;
+
+    block->nr++;
+    n0         = block->nra;
+    block->nra = n0+n;
+    srenew(block->index, block->nr+1);
+    block->index[block->nr] = n0+n;
+    srenew(block->a, n0+n);
+    for (i = 0; (i < n); i++)
+    {
+        block->a[n0+i] = index[i];
+    }
 }
 
-static void make_gname(int n,char **names,char *gname)
+static void make_gname(int n, char **names, char *gname)
 {
-  int i;
-  
-  strcpy(gname,names[0]);
-  for (i=1; i<n; i++) {
-    strcat(gname,"_");
-    strcat(gname,names[i]);
-  }
+    int i;
+
+    strcpy(gname, names[0]);
+    for (i = 1; i < n; i++)
+    {
+        strcat(gname, "_");
+        strcat(gname, names[i]);
+    }
 }
 
-static void copy_group(int g,t_blocka *block,atom_id *nr,atom_id *index)
+static void copy_group(int g, t_blocka *block, atom_id *nr, atom_id *index)
 {
-  int i,i0;
-  
-  i0=block->index[g];
-  *nr=block->index[g+1]-i0;
-  for (i=0; i<*nr; i++)
-    index[i]=block->a[i0+i];
+    int i, i0;
+
+    i0  = block->index[g];
+    *nr = block->index[g+1]-i0;
+    for (i = 0; i < *nr; i++)
+    {
+        index[i] = block->a[i0+i];
+    }
 }
 
-static void remove_group(int nr,int nr2,t_blocka *block,char ***gn)
+static void remove_group(int nr, int nr2, t_blocka *block, char ***gn)
 {
-  int i,j,shift;
-  char *name;
-  
-  if (nr2==NOTSET)
-    nr2=nr;
-  
-  for(j=0; j<=nr2-nr; j++) {
-    if ((nr<0) || (nr>=block->nr))
-      printf("Group %d does not exist\n",nr+j);
-    else {
-      shift=block->index[nr+1]-block->index[nr];
-      for(i=block->index[nr+1]; i<block->nra; i++)
-       block->a[i-shift]=block->a[i];
-      
-      for(i=nr; i<block->nr; i++)
-       block->index[i]=block->index[i+1]-shift;
-      name = strdup((*gn)[nr]);
-      sfree((*gn)[nr]);
-      for(i=nr; i<block->nr-1; i++) {  
-       (*gn)[i]=(*gn)[i+1];
-      }
-      block->nr--;
-      block->nra=block->index[block->nr];
-      printf("Removed group %d '%s'\n",nr+j,name);
-      sfree(name);
-    }
-  }
+    int   i, j, shift;
+    char *name;
+
+    if (nr2 == NOTSET)
+    {
+        nr2 = nr;
+    }
+
+    for (j = 0; j <= nr2-nr; j++)
+    {
+        if ((nr < 0) || (nr >= block->nr))
+        {
+            printf("Group %d does not exist\n", nr+j);
+        }
+        else
+        {
+            shift = block->index[nr+1]-block->index[nr];
+            for (i = block->index[nr+1]; i < block->nra; i++)
+            {
+                block->a[i-shift] = block->a[i];
+            }
+
+            for (i = nr; i < block->nr; i++)
+            {
+                block->index[i] = block->index[i+1]-shift;
+            }
+            name = strdup((*gn)[nr]);
+            sfree((*gn)[nr]);
+            for (i = nr; i < block->nr-1; i++)
+            {
+                (*gn)[i] = (*gn)[i+1];
+            }
+            block->nr--;
+            block->nra = block->index[block->nr];
+            printf("Removed group %d '%s'\n", nr+j, name);
+            sfree(name);
+        }
+    }
 }
 
-static void split_group(t_atoms *atoms,int sel_nr,t_blocka *block,char ***gn,
-                       gmx_bool bAtom)
+static void split_group(t_atoms *atoms, int sel_nr, t_blocka *block, char ***gn,
+                        gmx_bool bAtom)
 {
-  char buf[STRLEN],*name;
-  int i,resind;
-  atom_id a,n0,n1;
-
-  printf("Splitting group %d '%s' into %s\n",sel_nr,(*gn)[sel_nr],
-        bAtom ? "atoms" : "residues");
-  
-  n0=block->index[sel_nr];
-  n1=block->index[sel_nr+1];
-  srenew(block->a,block->nra+n1-n0);
-  for (i=n0; i<n1; i++) {
-    a=block->a[i];
-    resind = atoms->atom[a].resind;
-    name = *(atoms->resinfo[resind].name);
-    if (bAtom || (i==n0) || (atoms->atom[block->a[i-1]].resind!=resind)) { 
-      if (i>n0)
-       block->index[block->nr]=block->nra;
-      block->nr++;
-      srenew(block->index,block->nr+1);
-      srenew(*gn,block->nr);
-      if (bAtom)
-       sprintf(buf,"%s_%s_%u",(*gn)[sel_nr],*atoms->atomname[a],a+1);
-      else
-       sprintf(buf,"%s_%s_%d",(*gn)[sel_nr],name,atoms->resinfo[resind].nr);
-      (*gn)[block->nr-1]=strdup(buf);
-    }
-    block->a[block->nra]=a;
-    block->nra++;
-  }
-  block->index[block->nr]=block->nra;
+    char    buf[STRLEN], *name;
+    int     i, resind;
+    atom_id a, n0, n1;
+
+    printf("Splitting group %d '%s' into %s\n", sel_nr, (*gn)[sel_nr],
+           bAtom ? "atoms" : "residues");
+
+    n0 = block->index[sel_nr];
+    n1 = block->index[sel_nr+1];
+    srenew(block->a, block->nra+n1-n0);
+    for (i = n0; i < n1; i++)
+    {
+        a      = block->a[i];
+        resind = atoms->atom[a].resind;
+        name   = *(atoms->resinfo[resind].name);
+        if (bAtom || (i == n0) || (atoms->atom[block->a[i-1]].resind != resind))
+        {
+            if (i > n0)
+            {
+                block->index[block->nr] = block->nra;
+            }
+            block->nr++;
+            srenew(block->index, block->nr+1);
+            srenew(*gn, block->nr);
+            if (bAtom)
+            {
+                sprintf(buf, "%s_%s_%u", (*gn)[sel_nr], *atoms->atomname[a], a+1);
+            }
+            else
+            {
+                sprintf(buf, "%s_%s_%d", (*gn)[sel_nr], name, atoms->resinfo[resind].nr);
+            }
+            (*gn)[block->nr-1] = strdup(buf);
+        }
+        block->a[block->nra] = a;
+        block->nra++;
+    }
+    block->index[block->nr] = block->nra;
 }
 
-static int split_chain(t_atoms *atoms,rvec *x,
-                       int sel_nr,t_blocka *block,char ***gn)
+static int split_chain(t_atoms *atoms, rvec *x,
+                       int sel_nr, t_blocka *block, char ***gn)
 {
-  char    buf[STRLEN];
-  int     j,nchain;
-  atom_id i,a,natoms,*start=NULL,*end=NULL,ca_start,ca_end;
-  rvec    vec;
-
-  natoms=atoms->nr;
-  nchain=0;
-  ca_start=0;
-
-  while (ca_start<natoms) {
-    while((ca_start<natoms) && strcmp(*atoms->atomname[ca_start],"CA"))
-      ca_start++;
-    if (ca_start<natoms) {
-      srenew(start,nchain+1);
-      srenew(end,nchain+1);
-      start[nchain]=ca_start;
-      while ((start[nchain]>0) && 
-            (atoms->atom[start[nchain]-1].resind ==
-             atoms->atom[ca_start].resind))
-       start[nchain]--;
-
-      i=ca_start;
-      do {
-       ca_end=i;
-       do {
-         i++;
-       } while ((i<natoms) && strcmp(*atoms->atomname[i],"CA"));
-       if (i<natoms)
-         rvec_sub(x[ca_end],x[i],vec);
-      } while ((i<natoms) && (norm(vec)<0.45));
-      
-      end[nchain]=ca_end;
-      while ((end[nchain]+1<natoms) && 
-           (atoms->atom[end[nchain]+1].resind==atoms->atom[ca_end].resind)) 
-       end[nchain]++;
-      ca_start=end[nchain]+1;
-      nchain++;
-    }
-  }
-  if (nchain==1)
-    printf("Found 1 chain, will not split\n");
-  else
-    printf("Found %d chains\n",nchain);
-  for (j=0; j<nchain; j++)
-    printf("%d:%6u atoms (%u to %u)\n",
-          j+1,end[j]-start[j]+1,start[j]+1,end[j]+1);
-
-  if (nchain > 1) {
-    srenew(block->a,block->nra+block->index[sel_nr+1]-block->index[sel_nr]);
-    for (j=0; j<nchain; j++) {
-      block->nr++;
-      srenew(block->index,block->nr+1);
-      srenew(*gn,block->nr);
-      sprintf(buf,"%s_chain%d",(*gn)[sel_nr],j+1);
-      (*gn)[block->nr-1]=strdup(buf);
-      for (i=block->index[sel_nr]; i<block->index[sel_nr+1]; i++) {
-       a=block->a[i];
-       if ((a>=start[j]) && (a<=end[j])) {
-         block->a[block->nra]=a;
-         block->nra++;
-       }
-      }
-      block->index[block->nr]=block->nra;
-      if (block->index[block->nr-1]==block->index[block->nr])
-       remove_group(block->nr-1,NOTSET,block,gn);
-    }
-  }
-  sfree(start);
-  sfree(end);
-
-  return nchain;
+    char    buf[STRLEN];
+    int     j, nchain;
+    atom_id i, a, natoms, *start = NULL, *end = NULL, ca_start, ca_end;
+    rvec    vec;
+
+    natoms   = atoms->nr;
+    nchain   = 0;
+    ca_start = 0;
+
+    while (ca_start < natoms)
+    {
+        while ((ca_start < natoms) && strcmp(*atoms->atomname[ca_start], "CA"))
+        {
+            ca_start++;
+        }
+        if (ca_start < natoms)
+        {
+            srenew(start, nchain+1);
+            srenew(end, nchain+1);
+            start[nchain] = ca_start;
+            while ((start[nchain] > 0) &&
+                   (atoms->atom[start[nchain]-1].resind ==
+                    atoms->atom[ca_start].resind))
+            {
+                start[nchain]--;
+            }
+
+            i = ca_start;
+            do
+            {
+                ca_end = i;
+                do
+                {
+                    i++;
+                }
+                while ((i < natoms) && strcmp(*atoms->atomname[i], "CA"));
+                if (i < natoms)
+                {
+                    rvec_sub(x[ca_end], x[i], vec);
+                }
+            }
+            while ((i < natoms) && (norm(vec) < 0.45));
+
+            end[nchain] = ca_end;
+            while ((end[nchain]+1 < natoms) &&
+                   (atoms->atom[end[nchain]+1].resind == atoms->atom[ca_end].resind))
+            {
+                end[nchain]++;
+            }
+            ca_start = end[nchain]+1;
+            nchain++;
+        }
+    }
+    if (nchain == 1)
+    {
+        printf("Found 1 chain, will not split\n");
+    }
+    else
+    {
+        printf("Found %d chains\n", nchain);
+    }
+    for (j = 0; j < nchain; j++)
+    {
+        printf("%d:%6u atoms (%u to %u)\n",
+               j+1, end[j]-start[j]+1, start[j]+1, end[j]+1);
+    }
+
+    if (nchain > 1)
+    {
+        srenew(block->a, block->nra+block->index[sel_nr+1]-block->index[sel_nr]);
+        for (j = 0; j < nchain; j++)
+        {
+            block->nr++;
+            srenew(block->index, block->nr+1);
+            srenew(*gn, block->nr);
+            sprintf(buf, "%s_chain%d", (*gn)[sel_nr], j+1);
+            (*gn)[block->nr-1] = strdup(buf);
+            for (i = block->index[sel_nr]; i < block->index[sel_nr+1]; i++)
+            {
+                a = block->a[i];
+                if ((a >= start[j]) && (a <= end[j]))
+                {
+                    block->a[block->nra] = a;
+                    block->nra++;
+                }
+            }
+            block->index[block->nr] = block->nra;
+            if (block->index[block->nr-1] == block->index[block->nr])
+            {
+                remove_group(block->nr-1, NOTSET, block, gn);
+            }
+        }
+    }
+    sfree(start);
+    sfree(end);
+
+    return nchain;
 }
 
 static gmx_bool check_have_atoms(t_atoms *atoms, char *string)
 {
-  if ( atoms==NULL ) {
-    printf("Can not process '%s' without atom info, use option -f\n", string);
-    return FALSE;
-  } else
-    return TRUE;
+    if (atoms == NULL)
+    {
+        printf("Can not process '%s' without atom info, use option -f\n", string);
+        return FALSE;
+    }
+    else
+    {
+        return TRUE;
+    }
 }
 
-static gmx_bool parse_entry(char **string,int natoms,t_atoms *atoms,
-                       t_blocka *block,char ***gn,
-                       atom_id *nr,atom_id *index,char *gname)
+static gmx_bool parse_entry(char **string, int natoms, t_atoms *atoms,
+                            t_blocka *block, char ***gn,
+                            atom_id *nr, atom_id *index, char *gname)
 {
-  static char **names, *ostring;
-  static gmx_bool bFirst=TRUE;
-  int         j,n_names,sel_nr1;
-  atom_id     i,nr1,*index1;
-  char        c;
-  gmx_bool        bRet,bCompl;
-
-  if (bFirst) {
-    bFirst=FALSE;
-    snew(names,MAXNAMES);
-    for (i=0; i<MAXNAMES; i++)
-      snew(names[i],NAME_LEN+1);
-  }
-
-  bRet=FALSE;
-  sel_nr1=NOTSET;
-
-  while(*string[0]==' ')
-    (*string)++;
-
-  if ((*string)[0]=='!') {
-    bCompl=TRUE;
-    (*string)++;
-     while(*string[0]==' ')
-       (*string)++;
-  } else 
-    bCompl=FALSE;
-
-  ostring = *string;
-  
-  if (parse_int(string,&sel_nr1) || 
-      parse_string(string,&sel_nr1,block->nr,*gn)) {
-    if ((sel_nr1>=0) && (sel_nr1<block->nr)) {
-      copy_group(sel_nr1,block,nr,index);
-      strcpy(gname,(*gn)[sel_nr1]);
-      printf("Copied index group %d '%s'\n",sel_nr1,(*gn)[sel_nr1]);
-      bRet=TRUE;
-    } else
-      printf("Group %d does not exist\n",sel_nr1); 
-  } 
-  else if ((*string)[0]=='a') {
-    (*string)++;
-    if (check_have_atoms(atoms, ostring)) {
-    if (parse_int(string,&sel_nr1)) {
-      bRet=select_atomnumbers(string,atoms,sel_nr1,nr,index,gname);
-    } 
-    else if (parse_names(string,&n_names,names)) {
-      bRet=select_atomnames(atoms,n_names,names,nr,index,FALSE);
-      make_gname(n_names,names,gname);
-      }
-    }
-  }
-  else if ((*string)[0]=='t') {
-    (*string)++;
-    if (check_have_atoms(atoms, ostring) &&
-        parse_names(string,&n_names,names)) {
-      if (atoms->atomtype == NULL)
-       printf("Need a run input file to select atom types\n");
-      else {
-       bRet=select_atomnames(atoms,n_names,names,nr,index,TRUE);
-       make_gname(n_names,names,gname);
-      }
-    }
-  }
-  else if (strncmp(*string,"res",3)==0) {
-    (*string)+=3;
-    if ( check_have_atoms(atoms, ostring) &&
-        parse_int(string,&sel_nr1) &&
-        (sel_nr1>=0) && (sel_nr1<block->nr) ) {
-      bRet=atoms_from_residuenumbers(atoms,
-                                    sel_nr1,block,nr,index,(*gn)[sel_nr1]);
-      sprintf(gname,"atom_%s",(*gn)[sel_nr1]);
-    }
-  }
-  else if (strncmp(*string,"ri",2)==0) {
-    (*string)+=2;
-    if (check_have_atoms(atoms, ostring) && 
-               parse_int_char(string,&sel_nr1,&c)) {
-               bRet=select_residueindices(string,atoms,sel_nr1,c,nr,index,gname);
-    } 
-  }
-  else if ((*string)[0]=='r') {
-    (*string)++;
-    if (check_have_atoms(atoms, ostring)) {
-      if (parse_int_char(string,&sel_nr1,&c)) {
-       bRet=select_residuenumbers(string,atoms,sel_nr1,c,nr,index,gname);
-    } 
-    else if (parse_names(string,&n_names,names)) {
-      bRet=select_residuenames(atoms,n_names,names,nr,index);
-      make_gname(n_names,names,gname);
-    }
-  }
-  }
-  else if (strncmp(*string,"chain",5)==0) {
-    (*string)+=5;
-    if (check_have_atoms(atoms, ostring) &&
-        parse_names(string,&n_names,names)) {
-      bRet=select_chainnames(atoms,n_names,names,nr,index);
-      sprintf(gname,"ch%s",names[0]);
-      for (i=1; i<n_names; i++)
-       strcat(gname,names[i]);
-    }
-  }
-  if (bRet && bCompl) {
-    snew(index1,natoms-*nr);
-    nr1=0;
-    for(i=0; i<natoms; i++) {
-      j=0;
-      while ((j<*nr) && (index[j] != i))
-       j++;
-      if (j==*nr) {
-       if (nr1 >= natoms-*nr) {
-         printf("There are double atoms in your index group\n");
-         break;
-       }
-       index1[nr1]=i;
-       nr1++;
-      }
-    }
-    *nr=nr1;
-    for(i=0; i<nr1; i++) 
-      index[i]=index1[i];
-    sfree(index1);
-    
-    for (i=strlen(gname)+1; i>0; i--)
-      gname[i]=gname[i-1];
-    gname[0]='!';
-    printf("Complemented group: %u atoms\n",*nr);
-  }
-  
-  return bRet;
+    static char   **names, *ostring;
+    static gmx_bool bFirst = TRUE;
+    int             j, n_names, sel_nr1;
+    atom_id         i, nr1, *index1;
+    char            c;
+    gmx_bool        bRet, bCompl;
+
+    if (bFirst)
+    {
+        bFirst = FALSE;
+        snew(names, MAXNAMES);
+        for (i = 0; i < MAXNAMES; i++)
+        {
+            snew(names[i], NAME_LEN+1);
+        }
+    }
+
+    bRet    = FALSE;
+    sel_nr1 = NOTSET;
+
+    while (*string[0] == ' ')
+    {
+        (*string)++;
+    }
+
+    if ((*string)[0] == '!')
+    {
+        bCompl = TRUE;
+        (*string)++;
+        while (*string[0] == ' ')
+        {
+            (*string)++;
+        }
+    }
+    else
+    {
+        bCompl = FALSE;
+    }
+
+    ostring = *string;
+
+    if (parse_int(string, &sel_nr1) ||
+        parse_string(string, &sel_nr1, block->nr, *gn))
+    {
+        if ((sel_nr1 >= 0) && (sel_nr1 < block->nr))
+        {
+            copy_group(sel_nr1, block, nr, index);
+            strcpy(gname, (*gn)[sel_nr1]);
+            printf("Copied index group %d '%s'\n", sel_nr1, (*gn)[sel_nr1]);
+            bRet = TRUE;
+        }
+        else
+        {
+            printf("Group %d does not exist\n", sel_nr1);
+        }
+    }
+    else if ((*string)[0] == 'a')
+    {
+        (*string)++;
+        if (check_have_atoms(atoms, ostring))
+        {
+            if (parse_int(string, &sel_nr1))
+            {
+                bRet = select_atomnumbers(string, atoms, sel_nr1, nr, index, gname);
+            }
+            else if (parse_names(string, &n_names, names))
+            {
+                bRet = select_atomnames(atoms, n_names, names, nr, index, FALSE);
+                make_gname(n_names, names, gname);
+            }
+        }
+    }
+    else if ((*string)[0] == 't')
+    {
+        (*string)++;
+        if (check_have_atoms(atoms, ostring) &&
+            parse_names(string, &n_names, names))
+        {
+            if (atoms->atomtype == NULL)
+            {
+                printf("Need a run input file to select atom types\n");
+            }
+            else
+            {
+                bRet = select_atomnames(atoms, n_names, names, nr, index, TRUE);
+                make_gname(n_names, names, gname);
+            }
+        }
+    }
+    else if (strncmp(*string, "res", 3) == 0)
+    {
+        (*string) += 3;
+        if (check_have_atoms(atoms, ostring) &&
+            parse_int(string, &sel_nr1) &&
+            (sel_nr1 >= 0) && (sel_nr1 < block->nr) )
+        {
+            bRet = atoms_from_residuenumbers(atoms,
+                                             sel_nr1, block, nr, index, (*gn)[sel_nr1]);
+            sprintf(gname, "atom_%s", (*gn)[sel_nr1]);
+        }
+    }
+    else if (strncmp(*string, "ri", 2) == 0)
+    {
+        (*string) += 2;
+        if (check_have_atoms(atoms, ostring) &&
+            parse_int_char(string, &sel_nr1, &c))
+        {
+            bRet = select_residueindices(string, atoms, sel_nr1, c, nr, index, gname);
+        }
+    }
+    else if ((*string)[0] == 'r')
+    {
+        (*string)++;
+        if (check_have_atoms(atoms, ostring))
+        {
+            if (parse_int_char(string, &sel_nr1, &c))
+            {
+                bRet = select_residuenumbers(string, atoms, sel_nr1, c, nr, index, gname);
+            }
+            else if (parse_names(string, &n_names, names))
+            {
+                bRet = select_residuenames(atoms, n_names, names, nr, index);
+                make_gname(n_names, names, gname);
+            }
+        }
+    }
+    else if (strncmp(*string, "chain", 5) == 0)
+    {
+        (*string) += 5;
+        if (check_have_atoms(atoms, ostring) &&
+            parse_names(string, &n_names, names))
+        {
+            bRet = select_chainnames(atoms, n_names, names, nr, index);
+            sprintf(gname, "ch%s", names[0]);
+            for (i = 1; i < n_names; i++)
+            {
+                strcat(gname, names[i]);
+            }
+        }
+    }
+    if (bRet && bCompl)
+    {
+        snew(index1, natoms-*nr);
+        nr1 = 0;
+        for (i = 0; i < natoms; i++)
+        {
+            j = 0;
+            while ((j < *nr) && (index[j] != i))
+            {
+                j++;
+            }
+            if (j == *nr)
+            {
+                if (nr1 >= natoms-*nr)
+                {
+                    printf("There are double atoms in your index group\n");
+                    break;
+                }
+                index1[nr1] = i;
+                nr1++;
+            }
+        }
+        *nr = nr1;
+        for (i = 0; i < nr1; i++)
+        {
+            index[i] = index1[i];
+        }
+        sfree(index1);
+
+        for (i = strlen(gname)+1; i > 0; i--)
+        {
+            gname[i] = gname[i-1];
+        }
+        gname[0] = '!';
+        printf("Complemented group: %u atoms\n", *nr);
+    }
+
+    return bRet;
 }
 
 static void list_residues(t_atoms *atoms)
 {
-  int i,j,start,end,prev_resind,resind;
-  gmx_bool bDiff;
-
-  /* Print all the residues, assuming continuous resnr count */ 
-  start = atoms->atom[0].resind;
-  prev_resind = start;
-  for(i=0; i<atoms->nr; i++) {
-    resind = atoms->atom[i].resind;
-    if ((resind != prev_resind) || (i==atoms->nr-1)) {
-      if ((bDiff=strcmp(*atoms->resinfo[resind].name,
-                       *atoms->resinfo[start].name)) || 
-         (i==atoms->nr-1)) {
-       if (bDiff)
-         end = prev_resind;
-       else
-         end = resind;
-       if (end < start+3)
-         for(j=start; j<=end; j++)
-           printf("%4d %-5s",
-                  j+1,*(atoms->resinfo[j].name));
-       else
-         printf(" %4d - %4d %-5s  ",
-                start+1,end+1,*(atoms->resinfo[start].name));
-       start = resind;
-      }
-    }
-    prev_resind = resind;
-  }   
-  printf("\n");
+    int      i, j, start, end, prev_resind, resind;
+    gmx_bool bDiff;
+
+    /* Print all the residues, assuming continuous resnr count */
+    start       = atoms->atom[0].resind;
+    prev_resind = start;
+    for (i = 0; i < atoms->nr; i++)
+    {
+        resind = atoms->atom[i].resind;
+        if ((resind != prev_resind) || (i == atoms->nr-1))
+        {
+            if ((bDiff = strcmp(*atoms->resinfo[resind].name,
+                                *atoms->resinfo[start].name)) ||
+                (i == atoms->nr-1))
+            {
+                if (bDiff)
+                {
+                    end = prev_resind;
+                }
+                else
+                {
+                    end = resind;
+                }
+                if (end < start+3)
+                {
+                    for (j = start; j <= end; j++)
+                    {
+                        printf("%4d %-5s",
+                               j+1, *(atoms->resinfo[j].name));
+                    }
+                }
+                else
+                {
+                    printf(" %4d - %4d %-5s  ",
+                           start+1, end+1, *(atoms->resinfo[start].name));
+                }
+                start = resind;
+            }
+        }
+        prev_resind = resind;
+    }
+    printf("\n");
 }
 
-static void edit_index(int natoms, t_atoms *atoms,rvec *x,t_blocka *block, char ***gn, gmx_bool bVerbose)
+static void edit_index(int natoms, t_atoms *atoms, rvec *x, t_blocka *block, char ***gn, gmx_bool bVerbose)
 {
-  static char **atnames, *ostring;
-  static gmx_bool bFirst=TRUE;
-  char inp_string[STRLEN],*string;
-  char gname[STRLEN],gname1[STRLEN],gname2[STRLEN];
-  int  i,i0,i1,sel_nr,sel_nr2,newgroup;
-  atom_id nr,nr1,nr2,*index,*index1,*index2;
-  gmx_bool bAnd,bOr,bPrintOnce;
-  
-  if (bFirst) {
-    bFirst=FALSE;
-    snew(atnames,MAXNAMES);
-    for (i=0; i<MAXNAMES; i++)
-      snew(atnames[i],NAME_LEN+1);
-  }
-
-  string=NULL;
-
-  snew(index,natoms);
-  snew(index1,natoms);
-  snew(index2,natoms);
-
-  newgroup=NOTSET;
-  bPrintOnce = TRUE;
-  do { 
-    gname1[0]='\0';
-    if (bVerbose || bPrintOnce || newgroup!=NOTSET) {
-      printf("\n");
-      if (bVerbose || bPrintOnce || newgroup==NOTSET) {
-       i0=0;
-       i1=block->nr;
-      } else {
-       i0=newgroup;
-       i1=newgroup+1;
-      }
-      for(i=i0; i<i1; i++)
-      printf("%3d %-20s: %5u atoms\n",i,(*gn)[i],
-            block->index[i+1]-block->index[i]);
-      newgroup=NOTSET;
-    }
-    if (bVerbose || bPrintOnce) {
-      printf("\n");
-      printf(" nr : group       !   'name' nr name   'splitch' nr    Enter: list groups\n");
-      printf(" 'a': atom        &   'del' nr         'splitres' nr   'l': list residues\n");
-      printf(" 't': atom type   |   'keep' nr        'splitat' nr    'h': help\n");
-      printf(" 'r': residue         'res' nr         'chain' char\n");
-      printf(" \"name\": group        'case': case %s         'q': save and quit\n",
-            bCase ? "insensitive" : "sensitive  "); 
-         printf(" 'ri': residue index\n");
-      bPrintOnce = FALSE;
+    static char   **atnames, *ostring;
+    static gmx_bool bFirst = TRUE;
+    char            inp_string[STRLEN], *string;
+    char            gname[STRLEN], gname1[STRLEN], gname2[STRLEN];
+    int             i, i0, i1, sel_nr, sel_nr2, newgroup;
+    atom_id         nr, nr1, nr2, *index, *index1, *index2;
+    gmx_bool        bAnd, bOr, bPrintOnce;
+
+    if (bFirst)
+    {
+        bFirst = FALSE;
+        snew(atnames, MAXNAMES);
+        for (i = 0; i < MAXNAMES; i++)
+        {
+            snew(atnames[i], NAME_LEN+1);
+        }
     }
-    printf("\n");
-    printf("> ");
-    if(NULL==fgets(inp_string,STRLEN,stdin))
+
+    string = NULL;
+
+    snew(index, natoms);
+    snew(index1, natoms);
+    snew(index2, natoms);
+
+    newgroup   = NOTSET;
+    bPrintOnce = TRUE;
+    do
     {
-       gmx_fatal(FARGS,"Error reading user input");
+        gname1[0] = '\0';
+        if (bVerbose || bPrintOnce || newgroup != NOTSET)
+        {
+            printf("\n");
+            if (bVerbose || bPrintOnce || newgroup == NOTSET)
+            {
+                i0 = 0;
+                i1 = block->nr;
+            }
+            else
+            {
+                i0 = newgroup;
+                i1 = newgroup+1;
+            }
+            for (i = i0; i < i1; i++)
+            {
+                printf("%3d %-20s: %5u atoms\n", i, (*gn)[i],
+                       block->index[i+1]-block->index[i]);
+            }
+            newgroup = NOTSET;
+        }
+        if (bVerbose || bPrintOnce)
+        {
+            printf("\n");
+            printf(" nr : group       !   'name' nr name   'splitch' nr    Enter: list groups\n");
+            printf(" 'a': atom        &   'del' nr         'splitres' nr   'l': list residues\n");
+            printf(" 't': atom type   |   'keep' nr        'splitat' nr    'h': help\n");
+            printf(" 'r': residue         'res' nr         'chain' char\n");
+            printf(" \"name\": group        'case': case %s         'q': save and quit\n",
+                   bCase ? "insensitive" : "sensitive  ");
+            printf(" 'ri': residue index\n");
+            bPrintOnce = FALSE;
+        }
+        printf("\n");
+        printf("> ");
+        if (NULL == fgets(inp_string, STRLEN, stdin))
+        {
+            gmx_fatal(FARGS, "Error reading user input");
+        }
+        inp_string[strlen(inp_string)-1] = 0;
+        printf("\n");
+        string = inp_string;
+        while (string[0] == ' ')
+        {
+            string++;
+        }
+
+        ostring = string;
+        nr      = 0;
+        if (string[0] == 'h')
+        {
+            printf(" nr                : selects an index group by number or quoted string.\n");
+            printf("                     The string is first matched against the whole group name,\n");
+            printf("                     then against the beginning and finally against an\n");
+            printf("                     arbitrary substring. A multiple match is an error.\n");
+
+            printf(" 'a' nr1 [nr2 ...] : selects atoms, atom numbering starts at 1.\n");
+            printf(" 'a' nr1 - nr2     : selects atoms in the range from nr1 to nr2.\n");
+            printf(" 'a' name1[*] [name2[*] ...] : selects atoms by name(s), '?' matches any char,\n");
+            printf("                               wildcard '*' allowed at the end of a name.\n");
+            printf(" 't' type1[*] [type2[*] ...] : as 'a', but for type, run input file required.\n");
+            printf(" 'r' nr1[ic1] [nr2[ic2] ...] : selects residues by number and insertion code.\n");
+            printf(" 'r' nr1 - nr2               : selects residues in the range from nr1 to nr2.\n");
+            printf(" 'r' name1[*] [name2[*] ...] : as 'a', but for residue names.\n");
+            printf(" 'ri' nr1 - nr2              : selects residue indices, 1-indexed, (as opposed to numbers) in the range from nr1 to nr2.\n");
+            printf(" 'chain' ch1 [ch2 ...]       : selects atoms by chain identifier(s),\n");
+            printf("                               not available with a .gro file as input.\n");
+            printf(" !                 : takes the complement of a group with respect to all\n");
+            printf("                     the atoms in the input file.\n");
+            printf(" & |               : AND and OR, can be placed between any of the options\n");
+            printf("                     above, the input is processed from left to right.\n");
+            printf(" 'name' nr name    : rename group nr to name.\n");
+            printf(" 'del' nr1 [- nr2] : deletes one group or groups in the range from nr1 to nr2.\n");
+            printf(" 'keep' nr         : deletes all groups except nr.\n");
+            printf(" 'case'            : make all name compares case (in)sensitive.\n");
+            printf(" 'splitch' nr      : split group into chains using CA distances.\n");
+            printf(" 'splitres' nr     : split group into residues.\n");
+            printf(" 'splitat' nr      : split group into atoms.\n");
+            printf(" 'res' nr          : interpret numbers in group as residue numbers\n");
+            printf(" Enter             : list the currently defined groups and commands\n");
+            printf(" 'l'               : list the residues.\n");
+            printf(" 'h'               : show this help.\n");
+            printf(" 'q'               : save and quit.\n");
+            printf("\n");
+            printf(" Examples:\n");
+            printf(" > 2 | 4 & r 3-5\n");
+            printf(" selects all atoms from group 2 and 4 that have residue numbers 3, 4 or 5\n");
+            printf(" > a C* & !a C CA\n");
+            printf(" selects all atoms starting with 'C' but not the atoms 'C' and 'CA'\n");
+            printf(" > \"protein\" & ! \"backb\"\n");
+            printf(" selects all atoms that are in group 'protein' and not in group 'backbone'\n");
+            if (bVerbose)
+            {
+                printf("\npress Enter ");
+                getchar();
+            }
+        }
+        else if (strncmp(string, "del", 3) == 0)
+        {
+            string += 3;
+            if (parse_int(&string, &sel_nr))
+            {
+                while (string[0] == ' ')
+                {
+                    string++;
+                }
+                if (string[0] == '-')
+                {
+                    string++;
+                    parse_int(&string, &sel_nr2);
+                }
+                else
+                {
+                    sel_nr2 = NOTSET;
+                }
+                while (string[0] == ' ')
+                {
+                    string++;
+                }
+                if (string[0] == '\0')
+                {
+                    remove_group(sel_nr, sel_nr2, block, gn);
+                }
+                else
+                {
+                    printf("\nSyntax error: \"%s\"\n", string);
+                }
+            }
+        }
+        else if (strncmp(string, "keep", 4) == 0)
+        {
+            string += 4;
+            if (parse_int(&string, &sel_nr))
+            {
+                remove_group(sel_nr+1, block->nr-1, block, gn);
+                remove_group(0, sel_nr-1, block, gn);
+            }
+        }
+        else if (strncmp(string, "name", 4) == 0)
+        {
+            string += 4;
+            if (parse_int(&string, &sel_nr))
+            {
+                if ((sel_nr >= 0) && (sel_nr < block->nr))
+                {
+                    sscanf(string, "%s", gname);
+                    sfree((*gn)[sel_nr]);
+                    (*gn)[sel_nr] = strdup(gname);
+                }
+            }
+        }
+        else if (strncmp(string, "case", 4) == 0)
+        {
+            bCase = !bCase;
+            printf("Switched to case %s\n", bCase ? "sensitive" : "insensitive");
+        }
+        else if (string[0] == 'v')
+        {
+            bVerbose = !bVerbose;
+            printf("Turned verbose %s\n", bVerbose ? "on" : "off");
+        }
+        else if (string[0] == 'l')
+        {
+            if (check_have_atoms(atoms, ostring) )
+            {
+                list_residues(atoms);
+            }
+        }
+        else if (strncmp(string, "splitch", 7) == 0)
+        {
+            string += 7;
+            if (check_have_atoms(atoms, ostring) &&
+                parse_int(&string, &sel_nr) &&
+                (sel_nr >= 0) && (sel_nr < block->nr))
+            {
+                split_chain(atoms, x, sel_nr, block, gn);
+            }
+        }
+        else if (strncmp(string, "splitres", 8) == 0)
+        {
+            string += 8;
+            if (check_have_atoms(atoms, ostring) &&
+                parse_int(&string, &sel_nr) &&
+                (sel_nr >= 0) && (sel_nr < block->nr))
+            {
+                split_group(atoms, sel_nr, block, gn, FALSE);
+            }
+        }
+        else if (strncmp(string, "splitat", 7) == 0)
+        {
+            string += 7;
+            if (check_have_atoms(atoms, ostring) &&
+                parse_int(&string, &sel_nr) &&
+                (sel_nr >= 0) && (sel_nr < block->nr))
+            {
+                split_group(atoms, sel_nr, block, gn, TRUE);
+            }
+        }
+        else if (string[0] == '\0')
+        {
+            bPrintOnce = TRUE;
+        }
+        else if (string[0] != 'q')
+        {
+            nr1 = -1;
+            nr2 = -1;
+            if (parse_entry(&string, natoms, atoms, block, gn, &nr, index, gname))
+            {
+                do
+                {
+                    while (string[0] == ' ')
+                    {
+                        string++;
+                    }
+
+                    bAnd = FALSE;
+                    bOr  = FALSE;
+                    if (string[0] == '&')
+                    {
+                        bAnd = TRUE;
+                    }
+                    else if (string[0] == '|')
+                    {
+                        bOr = TRUE;
+                    }
+
+                    if (bAnd || bOr)
+                    {
+                        string++;
+                        nr1 = nr;
+                        for (i = 0; i < nr; i++)
+                        {
+                            index1[i] = index[i];
+                        }
+                        strcpy(gname1, gname);
+                        if (parse_entry(&string, natoms, atoms, block, gn, &nr2, index2, gname2))
+                        {
+                            if (bOr)
+                            {
+                                or_groups(nr1, index1, nr2, index2, &nr, index);
+                                sprintf(gname, "%s_%s", gname1, gname2);
+                            }
+                            else
+                            {
+                                and_groups(nr1, index1, nr2, index2, &nr, index);
+                                sprintf(gname, "%s_&_%s", gname1, gname2);
+                            }
+                        }
+                    }
+                }
+                while (bAnd || bOr);
+            }
+            while (string[0] == ' ')
+            {
+                string++;
+            }
+            if (string[0])
+            {
+                printf("\nSyntax error: \"%s\"\n", string);
+            }
+            else if (nr > 0)
+            {
+                copy2block(nr, index, block);
+                srenew(*gn, block->nr);
+                newgroup        = block->nr-1;
+                (*gn)[newgroup] = strdup(gname);
+            }
+            else
+            {
+                printf("Group is empty\n");
+            }
+        }
     }
-    inp_string[strlen(inp_string)-1]=0;
-    printf("\n");
-    string=inp_string;
-    while (string[0]==' ')
-      string++;
-
-    ostring = string;
-    nr=0;
-    if (string[0] == 'h') {
-      printf(" nr                : selects an index group by number or quoted string.\n");
-      printf("                     The string is first matched against the whole group name,\n");
-      printf("                     then against the beginning and finally against an\n");
-      printf("                     arbitrary substring. A multiple match is an error.\n");
-      
-      printf(" 'a' nr1 [nr2 ...] : selects atoms, atom numbering starts at 1.\n");
-      printf(" 'a' nr1 - nr2     : selects atoms in the range from nr1 to nr2.\n"); 
-      printf(" 'a' name1[*] [name2[*] ...] : selects atoms by name(s), '?' matches any char,\n"); 
-      printf("                               wildcard '*' allowed at the end of a name.\n");
-      printf(" 't' type1[*] [type2[*] ...] : as 'a', but for type, run input file required.\n");
-      printf(" 'r' nr1[ic1] [nr2[ic2] ...] : selects residues by number and insertion code.\n");
-      printf(" 'r' nr1 - nr2               : selects residues in the range from nr1 to nr2.\n");
-      printf(" 'r' name1[*] [name2[*] ...] : as 'a', but for residue names.\n");
-      printf(" 'ri' nr1 - nr2              : selects residue indices, 1-indexed, (as opposed to numbers) in the range from nr1 to nr2.\n");
-      printf(" 'chain' ch1 [ch2 ...]       : selects atoms by chain identifier(s),\n");
-      printf("                               not available with a .gro file as input.\n");
-      printf(" !                 : takes the complement of a group with respect to all\n");
-      printf("                     the atoms in the input file.\n");
-      printf(" & |               : AND and OR, can be placed between any of the options\n");
-      printf("                     above, the input is processed from left to right.\n");
-      printf(" 'name' nr name    : rename group nr to name.\n");
-      printf(" 'del' nr1 [- nr2] : deletes one group or groups in the range from nr1 to nr2.\n");
-      printf(" 'keep' nr         : deletes all groups except nr.\n");
-      printf(" 'case'            : make all name compares case (in)sensitive.\n"); 
-      printf(" 'splitch' nr      : split group into chains using CA distances.\n");
-      printf(" 'splitres' nr     : split group into residues.\n");
-      printf(" 'splitat' nr      : split group into atoms.\n");
-      printf(" 'res' nr          : interpret numbers in group as residue numbers\n");
-      printf(" Enter             : list the currently defined groups and commands\n");
-      printf(" 'l'               : list the residues.\n");
-      printf(" 'h'               : show this help.\n");
-      printf(" 'q'               : save and quit.\n");
-      printf("\n");
-      printf(" Examples:\n");
-      printf(" > 2 | 4 & r 3-5\n");
-      printf(" selects all atoms from group 2 and 4 that have residue numbers 3, 4 or 5\n");
-      printf(" > a C* & !a C CA\n");
-      printf(" selects all atoms starting with 'C' but not the atoms 'C' and 'CA'\n");  
-      printf(" > \"protein\" & ! \"backb\"\n");
-      printf(" selects all atoms that are in group 'protein' and not in group 'backbone'\n");
-      if (bVerbose) {
-       printf("\npress Enter ");
-       getchar();
-      }
-    }
-    else if (strncmp(string,"del",3)==0) {
-      string+=3;
-      if (parse_int(&string,&sel_nr)) {
-       while(string[0]==' ')
-         string++;
-       if (string[0]=='-') {
-         string++;
-         parse_int(&string,&sel_nr2);
-       } else
-         sel_nr2=NOTSET;
-       while(string[0]==' ')
-         string++;
-       if (string[0]=='\0')
-         remove_group(sel_nr,sel_nr2,block,gn);
-       else
-         printf("\nSyntax error: \"%s\"\n",string);
-      }
-    }
-    else if (strncmp(string,"keep",4)==0) {
-      string+=4;
-      if (parse_int(&string,&sel_nr)) {
-       remove_group(sel_nr+1,block->nr-1,block,gn);
-       remove_group(0,sel_nr-1,block,gn);
-      }
-    }
-    else if (strncmp(string,"name",4)==0) {
-      string+=4;
-      if (parse_int(&string,&sel_nr)) {
-       if ((sel_nr>=0) && (sel_nr<block->nr)) { 
-         sscanf(string,"%s",gname);
-         sfree((*gn)[sel_nr]);
-         (*gn)[sel_nr]=strdup(gname);
-       }
-      }
-    }
-    else if (strncmp(string,"case",4)==0) {
-      bCase=!bCase;
-      printf("Switched to case %s\n",bCase ? "sensitive" : "insensitive");
-    }
-    else if (string[0] == 'v' ) {
-      bVerbose=!bVerbose;
-      printf("Turned verbose %s\n",bVerbose ? "on" : "off");
-    }
-    else if (string[0] == 'l') {
-      if ( check_have_atoms(atoms, ostring) )
-      list_residues(atoms);
-    }
-    else if (strncmp(string,"splitch",7)==0) {
-      string+=7;
-      if ( check_have_atoms(atoms, ostring) && 
-          parse_int(&string,&sel_nr) &&
-          (sel_nr>=0) && (sel_nr<block->nr)) 
-         split_chain(atoms,x,sel_nr,block,gn);
-    }
-    else if (strncmp(string,"splitres",8)==0 ) {
-      string+=8;
-      if ( check_have_atoms(atoms, ostring) &&
-          parse_int(&string,&sel_nr) &&
-          (sel_nr>=0) && (sel_nr<block->nr)) 
-         split_group(atoms,sel_nr,block,gn,FALSE);
-    }
-    else if (strncmp(string,"splitat",7)==0 ) {
-     string+=7;
-      if ( check_have_atoms(atoms, ostring) &&
-          parse_int(&string,&sel_nr) &&
-          (sel_nr>=0) && (sel_nr<block->nr)) 
-         split_group(atoms,sel_nr,block,gn,TRUE);   
-    }
-    else if (string[0] == '\0') {
-      bPrintOnce = TRUE;
-    }
-    else if (string[0] != 'q') {
-      nr1=-1;
-      nr2=-1;
-      if (parse_entry(&string,natoms,atoms,block,gn,&nr,index,gname)) {
-       do {
-         while (string[0]==' ')
-           string++;
-         
-         bAnd=FALSE;
-         bOr=FALSE;
-         if (string[0]=='&')
-           bAnd=TRUE;
-         else if (string[0]=='|')
-           bOr=TRUE;
-         
-         if (bAnd || bOr) {
-           string++;
-           nr1=nr;
-           for(i=0; i<nr; i++)
-             index1[i]=index[i];
-           strcpy(gname1,gname);
-           if (parse_entry(&string,natoms,atoms,block,gn,&nr2,index2,gname2)) {
-             if (bOr) {
-               or_groups(nr1,index1,nr2,index2,&nr,index);
-               sprintf(gname,"%s_%s",gname1,gname2);
-             }
-             else {
-               and_groups(nr1,index1,nr2,index2,&nr,index);
-               sprintf(gname,"%s_&_%s",gname1,gname2);
-             }
-           }
-         }
-       } while (bAnd || bOr);
-      }
-      while(string[0]==' ')
-       string++;
-      if (string[0])
-       printf("\nSyntax error: \"%s\"\n",string);
-      else if (nr>0) {
-       copy2block(nr,index,block);
-       srenew(*gn,block->nr);
-       newgroup = block->nr-1;
-       (*gn)[newgroup]=strdup(gname);
-      }
-      else
-       printf("Group is empty\n");
-    }
-  } while (string[0]!='q');
-
-  sfree(index);
-  sfree(index1);
-  sfree(index2);
+    while (string[0] != 'q');
+
+    sfree(index);
+    sfree(index1);
+    sfree(index2);
 }
 
 static int block2natoms(t_blocka *block)
 {
-  int i, natoms;
-  
-  natoms = 0;
-  for(i=0; i<block->nra; i++)
-    natoms = max(natoms, block->a[i]);
-  natoms++;
-  
-  return natoms;
+    int i, natoms;
+
+    natoms = 0;
+    for (i = 0; i < block->nra; i++)
+    {
+        natoms = max(natoms, block->a[i]);
+    }
+    natoms++;
+
+    return natoms;
 }
 
 void merge_blocks(t_blocka *dest, t_blocka *source)
 {
-  int     i,nra0,i0;
-  
-  /* count groups, srenew and fill */
-  i0 = dest->nr;
-  nra0 = dest->nra;
-  dest->nr+=source->nr;
-  srenew(dest->index, dest->nr+1);
-  for(i=0; i<source->nr; i++)
-    dest->index[i0+i] = nra0 + source->index[i];
-  /* count atoms, srenew and fill */
-  dest->nra+=source->nra;
-  srenew(dest->a, dest->nra);
-  for(i=0; i<source->nra; i++)
-    dest->a[nra0+i] = source->a[i];
-  
-  /* terminate list */
-  dest->index[dest->nr]=dest->nra;
-  
+    int     i, nra0, i0;
+
+    /* count groups, srenew and fill */
+    i0        = dest->nr;
+    nra0      = dest->nra;
+    dest->nr += source->nr;
+    srenew(dest->index, dest->nr+1);
+    for (i = 0; i < source->nr; i++)
+    {
+        dest->index[i0+i] = nra0 + source->index[i];
+    }
+    /* count atoms, srenew and fill */
+    dest->nra += source->nra;
+    srenew(dest->a, dest->nra);
+    for (i = 0; i < source->nra; i++)
+    {
+        dest->a[nra0+i] = source->a[i];
+    }
+
+    /* terminate list */
+    dest->index[dest->nr] = dest->nra;
+
 }
 
-int gmx_make_ndx(int argc,char *argv[])
+int gmx_make_ndx(int argc, char *argv[])
 {
-  const char *desc[] = {
-    "Index groups are necessary for almost every gromacs program.",
-    "All these programs can generate default index groups. You ONLY",
-    "have to use [TT]make_ndx[tt] when you need SPECIAL index groups.",
-    "There is a default index group for the whole system, 9 default", 
-    "index groups for proteins, and a default index group",
-    "is generated for every other residue name.[PAR]",
-    "When no index file is supplied, also [TT]make_ndx[tt] will generate the",
-    "default groups.",
-    "With the index editor you can select on atom, residue and chain names",
-    "and numbers.",
-    "When a run input file is supplied you can also select on atom type.",
-    "You can use NOT, AND and OR, you can split groups",
-    "into chains, residues or atoms. You can delete and rename groups.[PAR]",
-    "The atom numbering in the editor and the index file starts at 1."
-  };
-
-  static int natoms=0;
-  static gmx_bool bVerbose=FALSE;
-  t_pargs pa[] = {
-    { "-natoms",  FALSE, etINT, {&natoms}, 
-      "set number of atoms (default: read from coordinate or index file)" },
-    { "-verbose", FALSE, etBOOL, {&bVerbose}, 
-      "HIDDENVerbose output" }
-  };
+    const char     *desc[] = {
+        "Index groups are necessary for almost every gromacs program.",
+        "All these programs can generate default index groups. You ONLY",
+        "have to use [TT]make_ndx[tt] when you need SPECIAL index groups.",
+        "There is a default index group for the whole system, 9 default",
+        "index groups for proteins, and a default index group",
+        "is generated for every other residue name.[PAR]",
+        "When no index file is supplied, also [TT]make_ndx[tt] will generate the",
+        "default groups.",
+        "With the index editor you can select on atom, residue and chain names",
+        "and numbers.",
+        "When a run input file is supplied you can also select on atom type.",
+        "You can use NOT, AND and OR, you can split groups",
+        "into chains, residues or atoms. You can delete and rename groups.[PAR]",
+        "The atom numbering in the editor and the index file starts at 1."
+    };
+
+    static int      natoms   = 0;
+    static gmx_bool bVerbose = FALSE;
+    t_pargs         pa[]     = {
+        { "-natoms",  FALSE, etINT, {&natoms},
+          "set number of atoms (default: read from coordinate or index file)" },
+        { "-verbose", FALSE, etBOOL, {&bVerbose},
+          "HIDDENVerbose output" }
+    };
 #define NPA asize(pa)
 
-  output_env_t oenv;
-  char     title[STRLEN];
-  int      nndxin;   
-  const char *stxfile; 
-  char     **ndxinfiles;
-  const char *ndxoutfile;
-  gmx_bool     bNatoms;
-  int      i,j;
-  t_atoms  *atoms;
-  rvec     *x,*v;
-  int      ePBC;
-  matrix   box;
-  t_blocka *block,*block2;
-  char     **gnames,**gnames2;
-  t_filenm fnm[] = {
-    { efSTX, "-f", NULL,     ffOPTRD  },
-    { efNDX, "-n", NULL,     ffOPTRDMULT },
-    { efNDX, "-o", NULL,     ffWRITE }
-  };
+    output_env_t oenv;
+    char         title[STRLEN];
+    int          nndxin;
+    const char  *stxfile;
+    char       **ndxinfiles;
+    const char  *ndxoutfile;
+    gmx_bool     bNatoms;
+    int          i, j;
+    t_atoms     *atoms;
+    rvec        *x, *v;
+    int          ePBC;
+    matrix       box;
+    t_blocka    *block, *block2;
+    char       **gnames, **gnames2;
+    t_filenm     fnm[] = {
+        { efSTX, "-f", NULL,     ffOPTRD  },
+        { efNDX, "-n", NULL,     ffOPTRDMULT },
+        { efNDX, "-o", NULL,     ffWRITE }
+    };
 #define NFILE asize(fnm)
-  
-  parse_common_args(&argc,argv,0,NFILE,fnm,NPA,pa,asize(desc),desc,
-                   0,NULL,&oenv);
-  
-  stxfile = ftp2fn_null(efSTX,NFILE,fnm);
-  if (opt2bSet("-n",NFILE,fnm)) {
-    nndxin = opt2fns(&ndxinfiles,"-n",NFILE,fnm);
-  } else {
-    nndxin = 0;
-  }
-  ndxoutfile = opt2fn("-o",NFILE,fnm);
-  bNatoms = opt2parg_bSet("-natoms",NPA,pa);
-  
-  if (!stxfile && !nndxin)
-    gmx_fatal(FARGS,"No input files (structure or index)");
-  
-  if (stxfile) {
-    snew(atoms,1);
-    get_stx_coordnum(stxfile,&(atoms->nr));
-    init_t_atoms(atoms,atoms->nr,TRUE);
-    snew(x,atoms->nr);
-    snew(v,atoms->nr);
-    fprintf(stderr,"\nReading structure file\n");
-    read_stx_conf(stxfile,title,atoms,x,v,&ePBC,box);
-    natoms = atoms->nr;
-    bNatoms=TRUE;
-  } else {
-    atoms = NULL;
-    x = NULL;
-  }
-
-  /* read input file(s) */
-  block = new_blocka();
-  gnames = NULL;
-  printf("Going to read %d old index file(s)\n",nndxin);
-  if (nndxin) {
-    for(i=0; i<nndxin; i++) {
-      block2 = init_index(ndxinfiles[i],&gnames2);
-      srenew(gnames, block->nr+block2->nr);
-      for(j=0; j<block2->nr; j++)
-       gnames[block->nr+j]=gnames2[j];
-      sfree(gnames2);
-      merge_blocks(block, block2);
-      sfree(block2->a);
-      sfree(block2->index);
+
+    parse_common_args(&argc, argv, 0, NFILE, fnm, NPA, pa, asize(desc), desc,
+                      0, NULL, &oenv);
+
+    stxfile = ftp2fn_null(efSTX, NFILE, fnm);
+    if (opt2bSet("-n", NFILE, fnm))
+    {
+        nndxin = opt2fns(&ndxinfiles, "-n", NFILE, fnm);
+    }
+    else
+    {
+        nndxin = 0;
+    }
+    ndxoutfile = opt2fn("-o", NFILE, fnm);
+    bNatoms    = opt2parg_bSet("-natoms", NPA, pa);
+
+    if (!stxfile && !nndxin)
+    {
+        gmx_fatal(FARGS, "No input files (structure or index)");
+    }
+
+    if (stxfile)
+    {
+        snew(atoms, 1);
+        get_stx_coordnum(stxfile, &(atoms->nr));
+        init_t_atoms(atoms, atoms->nr, TRUE);
+        snew(x, atoms->nr);
+        snew(v, atoms->nr);
+        fprintf(stderr, "\nReading structure file\n");
+        read_stx_conf(stxfile, title, atoms, x, v, &ePBC, box);
+        natoms  = atoms->nr;
+        bNatoms = TRUE;
+    }
+    else
+    {
+        atoms = NULL;
+        x     = NULL;
+    }
+
+    /* read input file(s) */
+    block  = new_blocka();
+    gnames = NULL;
+    printf("Going to read %d old index file(s)\n", nndxin);
+    if (nndxin)
+    {
+        for (i = 0; i < nndxin; i++)
+        {
+            block2 = init_index(ndxinfiles[i], &gnames2);
+            srenew(gnames, block->nr+block2->nr);
+            for (j = 0; j < block2->nr; j++)
+            {
+                gnames[block->nr+j] = gnames2[j];
+            }
+            sfree(gnames2);
+            merge_blocks(block, block2);
+            sfree(block2->a);
+            sfree(block2->index);
 /*       done_block(block2); */
-      sfree(block2);
-    }
-  } 
-  else {
-    snew(gnames,1);
-    analyse(atoms,block,&gnames,FALSE,TRUE);
-  }
-  
-  if (!bNatoms) {
-    natoms = block2natoms(block);
-    printf("Counted atom numbers up to %d in index file\n", natoms);
-  }
-
-  edit_index(natoms,atoms,x,block,&gnames,bVerbose);
-
-  write_index(ndxoutfile,block,gnames);
-
-  thanx(stderr);
-    
-  return 0;
+            sfree(block2);
+        }
+    }
+    else
+    {
+        snew(gnames, 1);
+        analyse(atoms, block, &gnames, FALSE, TRUE);
+    }
+
+    if (!bNatoms)
+    {
+        natoms = block2natoms(block);
+        printf("Counted atom numbers up to %d in index file\n", natoms);
+    }
+
+    edit_index(natoms, atoms, x, block, &gnames, bVerbose);
+
+    write_index(ndxoutfile, block, gnames);
+
+    thanx(stderr);
+
+    return 0;
 }