#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <thread.h>

#include "dt_smiles.h"
#include "dt_smarts.h"
#include "mp_utils.c"

#define MAXSMI 5000
#define MAX_THREADS 40

/*============================================
 * do_smarts() - Test a single SMILES against
 * a pattern and quit.
 ============================================= */

void *do_smarts(void *arg)
{
  char      line[MAXSMI];
  dt_Handle mol;
  dt_String cansmi;
  int       lencan, i;

  fprintf(stderr, ".");
  while (1)
    {
      if (feof(stdin))
        pthread_exit(NULL);

      if (!gets(line))
        pthread_exit((void *)1);

      mol = dt_smilin(strlen(line), line);
      if (mol == NULL_OB)
        fprintf(stderr, "smilin failed.\n");
      if (dt_match((dt_Handle)arg, mol, TRUE))
        printf("%s\n", line);
      dt_dealloc(mol);
    }
  return (NULL);
}

main(int argc, char *argv[])
{
  dt_Handle pattern;
  void *status;
  int i, ok = TRUE;
  int thr_count = 4;
  
  dt_mp_initialize();
  
  /*** Get SMARTS from command line ***/
  
  if ((2 != argc) && (3 != argc))
    ok = FALSE;
  else
    {
      pattern = dt_smartin(strlen(argv[1]), argv[1]);
      if (NULL_OB == pattern)
	{
	  fprintf(stderr, "Can't parse SMARTS: \"%s\"\n", argv[1]);
	  exit(1);
	}
    }
  
  if ((argc == 3) && (1 != sscanf(argv[2], "%d", &thr_count)))
    ok = FALSE;
  
  if (thr_count < 0) thr_count = 1;
  if (thr_count > MAX_THREADS) thr_count = MAX_THREADS;
  
  if (!ok)
    {
      fprintf(stderr, "usage: %s SMARTS [num_threads]\n", argv[0]);
      exit(1);
    }

  fprintf(stderr, "thr_count: %d\n", thr_count);
  for (i = 0; i < thr_count; i++)
    pthread_create(&thr, NULL, do_smarts, (void *)dt_copy(pattern));
  
  thr_exit(NULL);
}