/* $Revision Header *** Header built automatically - do not edit! ***********
 *
 *	(C) Copyright 1991 by Metalworx
 *
 *	Name .....: convm3d.c
 *	Created ..: Fri 13-Sep-91 13:45
 *	Revision .: 1
 *
 *	Date		Author		Comment
 *	=========	========	====================
 *	28-Jun-92	Mtwx		now creates name of mol creator
 *					(CONVM3D) to be compatible with
 *					Chemesthetics version >= 2.14
 *	07-Jul-91	Mtwx		Created this file!
 *
 * $Revision Header ********************************************************/
 #define REVISION 1

/***************************************************************************
* convm3d.c: Programm zum Konvertieren von Molec3D-Files in Chemesthetics- *
*	     Datenfiles 						   *
***************************************************************************/

/* ------------------------------- includes ----------------------------- */

#include <ctype.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <exec/types.h>

/* ------------------------------- defines ------------------------------ */

#define MAXATOMS 500

/* ------------------------------- global references -------------------- */

char *Atom[MAXATOMS],DAtom[106][3];
int X[MAXATOMS],Y[MAXATOMS],Z[MAXATOMS];
double Radius[106];

/* ------------------------------- external references ------------------ */

extern char ProgId[],Version[],Date[];	  /* from rev.c */
extern int Revision;

/* ------------------------------- prototypes --------------------------- */

int main(int,char**);
void zeile_verarbeiten(char*,int);
void usage(void);

/* ------------------------------- routines ----------------------------- */

int main(int argc, char **argv)
{
  int i,j,hradius=50,numatoms=0,numdatoms=0;
  BOOL found=FALSE;
  char zeile[82];
  FILE *edatei, *adatei, *ddatei;

  printf("\n%s %s/%d - %s,  (C) 1992 Metalworx\n",ProgId,Version,Revision,
	 Date);
  if(argc<3 || argc>4)
  {
    usage();
    exit(1);
  }
  if(argc==4)
    hradius=atoi(argv[3]);
  edatei=fopen(argv[1],"r");
  if(!edatei)
  {
    perror(argv[1]);
    exit(1);
  }
  adatei=fopen(argv[2],"w");
  if(!adatei)
  {
    perror(argv[2]);
    exit(1);
  }
  ddatei=fopen("convm3d.dta","r");
  if(!ddatei)
  {
    perror("Datafile 'convm3d.dta' not found");
    exit(1);
  }
  printf("reading");
  while(!feof(ddatei))
  {
    fgets(zeile,10,ddatei);
    zeile[strlen(zeile)-1]='\0';  /* delete \n */
    strcpy(DAtom[numdatoms],zeile);
    fgets(zeile,10,ddatei);
    Radius[numdatoms]=atof(zeile);
    numdatoms++;
    printf(".");
  }
  fclose(ddatei);
  printf("\nprocessing");
  strcpy(zeile,"");
  do
  {
    fgets(zeile,80,edatei);
    zeile_verarbeiten(zeile,numatoms);
    numatoms++;
    printf(".");
  } while(zeile[0]!='\n');
  numatoms--;		/* do not take empty line ! */

/* save output file */
  printf("\nwriting");
  fprintf(adatei,"%d\n",numatoms);    /* save number of atoms */
  for(i=0;i<numatoms;i++)
  {
    printf(".");
    /* save atom and its coordinates */
    fprintf(adatei,"%s\n%d\n%d\n%d\n",Atom[i],X[i], Y[i],Z[i]);
    for(j=0;j<numdatoms;j++)
    {
      if(stricmp(Atom[i],DAtom[j])==NULL)
      {
	fprintf(adatei,"%d\n",(int)((Radius[j]/Radius[0])*(double)hradius));
	found=TRUE;
      }
    }
    if(!found)
      printf("Atom %s not included in convm3d.dta\n",Atom[i]);
    found=FALSE;
  }
  fprintf(adatei,"1.0\n"); /* magnification factor */
  fprintf(adatei,"0\n0\n0\n"); /* molecul turns X-Y-Z */
  fprintf(adatei,"10000.0\n-200000.0\n10000.0\n"); /* light vector */
  fprintf(adatei,"10\n"); /* reflection */
  fprintf(adatei,"*** CONVM3D ****\n"); /* name of creator */
  fclose(edatei);
  fclose(adatei);
  printf("\nfinished!\n");
  exit(0);
}

void zeile_verarbeiten(char *zeile,int count)
{
  register int i=-1,j=0;
  char Name[3];
  double x,y,z;

  while(isspace(zeile[++i]));
  while(isalpha(zeile[i]))
    Name[j++]=zeile[i++];
  Name[j]='\0';
  Atom[count]=malloc(3);
  strcpy(Atom[count],Name);

  i+=2;     /* set to white space */
  while(isspace(zeile[++i]));
  x=atof(&zeile[i]);
  while(!isspace(zeile[i++]));
  while(isspace(zeile[++i]));
  y=atof(&zeile[i]);
  while(!isspace(zeile[i++]));
  while(isspace(zeile[++i]));
  z=atof(&zeile[i]);

  X[count]=(int)(x*100.0);
  Y[count]=(int)(y*100.0);
  Z[count]=(int)(z*100.0);
}

void usage(void)
{
  puts("usage: convm3d <infile> <outfile> [H-radius]");
}
