int ChampAtomToString()

in contrib/champ/champ.c [4532:4720]


int ChampAtomToString(CChamp *I,int index,char *buf) 
{
  /* first, determine whether this is a trivial or block atom */
  int c;
  int mask;
  int a;
  int trivial=true;
  ListAtom *at;
  
  buf[0]=0;
  if(index) {
    at=I->Atom + index;

  /* the following are non-trivial */

    trivial = trivial && (!at->neg_flag) && (!at->hydro_flag);
    trivial = trivial && !(at->charge&(cH_Cation|cH_Dication|
                                       cH_Anion|cH_Dianion|
                                       cH_Trication|cH_Trianion|
                                       cH_Tetcation|cH_Tetanion|
                                       cH_Pentcation|cH_Pentanion
                                       ));
    trivial = trivial && !(at->cycle|at->valence|at->degree);
    trivial = trivial && !(at->class&cH_Aliphatic);

    trivial = trivial && !((at->atom!=cH_Any) &&
                           at->atom&( cH_Na | cH_K  | cH_Ca | cH_Mg | 
                                      cH_Zn | cH_Fe | cH_Cu | cH_Se |
                                      cH_A  | cH_E  | cH_G  | cH_J  |
                                      cH_L  | cH_M  | cH_Q  | cH_R  |
                                      cH_T | cH_X | cH_Z ));

    trivial = trivial && (at->stereo==0);

    if(trivial&&(at->atom!=cH_Any)) {
      /* check number of atoms represented */
      c = 0;
      mask = 1;
      for(a=0;a<32;a++) {
        if(mask&at->atom) {
          c++;
          if(c>1) {
            trivial=false;
            break;
          }
        }
        mask=mask*2;
      }
    }

  
    if(trivial) {
      if(at->class&cH_Aromatic) {
        switch(at->atom) {      
        case cH_C: buf[0]='c'; buf[1]=0; break;
        case cH_N: buf[0]='n'; buf[1]=0; break;
        case cH_O: buf[0]='o'; buf[1]=0; break;
        case cH_S: buf[0]='s'; buf[1]=0; break;
        default:
          trivial=false; break;
        }
      } else {
        switch(at->atom) {
        case cH_Any: buf[0]='*'; buf[1]=0; break;
        case cH_NotH: buf[0]='?'; buf[1]=0; break;
        case cH_B: buf[0]='B'; buf[1]=0; break;
        case cH_C: buf[0]='C'; buf[1]=0; break;
        case cH_N: buf[0]='N'; buf[1]=0; break;
        case cH_O: buf[0]='O'; buf[1]=0; break;
          /*        case cH_H: buf[0]='H'; buf[1]=0; break;*/
        case cH_H: strcpy(buf,"[H]"); break;
        case cH_S: buf[0]='S'; buf[1]=0; break;
        case cH_P: buf[0]='P'; buf[1]=0; break;
        case cH_F: buf[0]='F'; buf[1]=0; break;
        case cH_Cl: buf[0]='C'; buf[1]='l'; buf[2]=0; break;
        case cH_Br: buf[0]='B'; buf[1]='r'; buf[2]=0; break;
        case cH_I:  buf[0]='I'; buf[1]=0; break;
        default: 
          trivial = false; break;
        }
      }
    }
    if(!trivial) {
      strcat(buf,"[");
      if(at->atom==cH_Sym) {
        strcat(buf,at->symbol);
      } else {
        switch(at->atom) {
        case cH_Any: strcat(buf,"*"); break;
        case cH_NotH: strcat(buf,"?"); break; 
        case cH_B: strcat(buf,"B"); break;
        case cH_C: strcat(buf,"C"); break;
        case cH_N: strcat(buf,"N"); break;
        case cH_O: strcat(buf,"O"); break;
        case cH_H: strcat(buf,"H"); break;
        case cH_S: strcat(buf,"S"); break;
        case cH_P: strcat(buf,"P"); break;
        case cH_F: strcat(buf,"F"); break;
        case cH_Cl: strcat(buf,"Cl"); break;
        case cH_Br: strcat(buf,"Br"); break;
        case cH_I: strcat(buf,"I"); break;
        case cH_Na: strcat(buf,"Na"); break;
        case cH_K: strcat(buf,"K"); break;
        case cH_Ca: strcat(buf,"Ca"); break;
        case cH_Mg: strcat(buf,"Mg"); break;
        case cH_Fe: strcat(buf,"Fe"); break;
        case cH_Zn: strcat(buf,"Zn"); break;
        case cH_Cu: strcat(buf,"Cu"); break;
        case cH_Se: strcat(buf,"Se"); break;
        case cH_A: strcat(buf,"A"); break;
        case cH_E: strcat(buf,"E"); break;
        case cH_G: strcat(buf,"G"); break;
        case cH_J: strcat(buf,"J"); break;
        case cH_L: strcat(buf,"L"); break;
        case cH_M: strcat(buf,"M"); break;
        case cH_Q: strcat(buf,"Q"); break;
        case cH_R: strcat(buf,"R"); break;
        case cH_T: strcat(buf,"T"); break;
        case cH_X: strcat(buf,"X"); break;
        case cH_Z: strcat(buf,"Z"); break;
        default: sprintf(buf,"%x",at->atom); break;
        }
      }
      switch(at->stereo) {
      case cH_Anticlock:
        strcat(buf,"@");
        break;
      case cH_Clockwise:
        strcat(buf,"@@");
        break;
      }
      if(at->imp_hydro) {
        switch(at->imp_hydro) {
        case 0:
          break;
        case 1:
          strcat(buf,"H");
          break;
        case 2:
          strcat(buf,"H2");
          break;
        case 3:
          strcat(buf,"H3");
          break;
        case 4:
          strcat(buf,"H4");
          break;
        }
      }
      if(at->charge) {
        switch(at->charge) {
        case cH_Cation:
          strcat(buf,"+");
          break;
        case cH_Anion:
          strcat(buf,"-");
          break;
        case cH_Dication:
          strcat(buf,"++");
          break;
        case cH_Dianion:
          strcat(buf,"--");
          break;
        case cH_Trication:
          strcat(buf,"+3");
          break;
        case cH_Trianion:
          strcat(buf,"-3");
          break;
        case cH_Tetcation:
          strcat(buf,"+4");
          break;
        case cH_Tetanion:
          strcat(buf,"-4");
          break;
        case cH_Pentcation:
          strcat(buf,"+5");
          break;
        case cH_Pentanion:
          strcat(buf,"-5");
          break;
        }
      }
      strcat(buf,"]");
    }
  } else 
    buf[0]=0;
  return(strlen(buf));
}