#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); }