/* cansmi.c */
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <pthread.h>
#include "dt_smiles.h"
#include "mp_utils.c"
#define MAXSMI 5000
#define THR_COUNT 4
/*==========================================================
* Each thread reads until EOF. When a thread gets a
* SMILES, it'll canonicalize it. Note that all the
* I/O stream locking is handled invisibly by the stdio
* library.
========================================================= */
void *do_cansmi_forever(void *arg)
{
char line[MAXSMI];
dt_Handle mol;
dt_String cansmi;
int lencan;
fprintf(stderr, ".");
while (1)
{
if (feof(stdin))
pthread_exit((void *)1);
/*** This handles concurrancy in the input stream
automatically as part of the stdio library ***/
if (!gets(line))
pthread_exit((void *)1);
mol = dt_smilin(strlen(line), line);
if (mol == NULL_OB)
fprintf(stderr, "smilin failed.\n");
cansmi = dt_cansmiles(&lencan, mol, 1);
/*** printf handles output concurrancy ***/
if (0 < lencan)
printf("%.*s\n", lencan, cansmi);
dt_dealloc(mol);
}
return (NULL);
}
main(int argc, char *argv[])
{
pthread_t thr;
int i, thr_count;
dt_mp_initialize();
/*** Read in the count of threads to use from the
user, if available ***/
if ((argc != 2) ||
(1 != sscanf(argv[1], "%d", &thr_count)))
thr_count = THR_COUNT;
/*** Start up the required threads ***/
fprintf(stderr, "thr_count: %d\n", thr_count);
for (i = 0; i < thr_count; i++)
pthread_create(&thr, NULL, do_cansmi_forever, NULL);
return(NULL);
}