#include #include #include "dt_smiles.h" #include "dt_progob.h" #include "du_pipeio.h" #include #define TRUE 1 #define FALSE 0 #define MX_SMILES 1000 /*====================================================================== * A couple of handy macros: * STRNZEQV -- Test for equivalence of defined-length and NULL- * terminated strings. * ATS -- Appends NULL-terminated string s to sequence o. ======================================================================*/ #define STRNZEQV(a,b,n) (strlen(a) == (n) && 0 == strncmp((a), (b), (n))) #define ATS(o,s) dt_append((o), dt_alloc_string(strlen(s), (s))) /*************************************************************************** * FUNCTION: app2seq * DESCRIPTION: Append sos (sequence-of-strings) t to sos s and return sos s. ***************************************************************************/ static dt_Handle app2seq(dt_Handle s, dt_Handle t) { dt_Handle ob; dt_reset(t); while (NULL_OB != (ob = dt_next(t))) dt_append(s, ob); return s; } /*************************************************************************** * FUNCTION: help * DESCRIPTION: Returns help message. ***************************************************************************/ static dt_Handle help(void) { dt_Handle sos = dt_alloc_seq(); ATS(sos, "Exhaustive isomeric SMILES generation."); ATS(sos, "This program demonstrates the function du_chiralify()."); ATS(sos, "Enter a SMILES, see unspecified chiralities enumerated."); ATS(sos, "No program options or arguments are used."); dt_reset(sos); return sos; } /*************************************************************************** * FUNCTION: program * DESCRIPTION: Return program name as sequence of strings ***************************************************************************/ static dt_Handle program(void) { dt_Handle sos = dt_alloc_seq(); ATS(sos, "chiralify_talk 1.0"); dt_reset(sos); return sos; } /*************************************************************************** * FUNCTION: version * DESCRIPTION: Return version number of this program as sequence of strings ***************************************************************************/ static dt_Handle version(void) { dt_Handle sos = dt_alloc_seq(); ATS(sos, "1"); dt_reset(sos); return sos; } /*************************************************************************** * FUNCTION: notice * DESCRIPTION: Return copyright notice for program as sequence of strings ***************************************************************************/ static dt_Handle notice(void) { dt_Handle sos = dt_alloc_seq(); ATS(sos, "chiralify_talk, Copyright (c) 2004, Daylight CIS, Inc."); ATS(sos, "chiralify_talk may be freely distributed."); dt_reset(sos); return sos; } /*************************************************************************** * FUNCTION: mytalk * DESCRIPTION: "Callback" function for du_pipe_loop() dispatch function. When * messages arrive, this function is called with the messages as a * sequence of strings (sos). It returns its response as another sos. ***************************************************************************/ static dt_Handle mytalk(dt_Handle msgin) { dt_Handle msgout, sob; char *str; int lens; /*** NULL_OB is like EOF, return "farewell" message. ***/ if (NULL_OB == msgin) { msgout = dt_alloc_seq(); return msgout; /* return empty "farewell" message */ } /*** Respond to msgin by creating msgout. ***/ msgout = dt_alloc_seq(); dt_reset(msgin); while (NULL_OB != (sob = dt_next(msgin))) { str = dt_stringvalue(&lens, sob); /*** Respond to standard messages. ***/ if (STRNZEQV(DX_PT_HELP, str, lens)) app2seq(msgout, help() ); else if (STRNZEQV(DX_PT_PROGRAM, str, lens)) app2seq(msgout, program()); else if (STRNZEQV(DX_PT_VERSION, str, lens)) app2seq(msgout, version()); else if (STRNZEQV(DX_PT_NOTICE, str, lens)) app2seq(msgout, notice() ); /*** Program-specific messages (there are none). ***/ else if (STRNZEQV(DX_PT_MSGLIST, str, lens)) continue; /*** Normal messages -- SMILES. ***/ else app2seq(msgout, chiralify(lens, str)); } dt_reset(msgout); return msgout; } /*************************************************************************** * FUNCTION: my_welcome * DESCRIPTION: Return welcome message (initial unprompted message) ***************************************************************************/ static dt_Handle my_welcome() { dt_Handle sos; char buf[80]; sos = dt_alloc_seq(); sprintf(buf, "chiralify_talk"); dt_append(sos, dt_alloc_string(strlen(buf), (buf))); dt_reset(sos); return sos; } /*************************************************************************** * FUNCTION: main * DESCRIPTION: Main loop -- invokes dy_pipe_loop() to dispatch events. ***************************************************************************/ main() { /*** Loop for input. ***/ du_pipe_loop(my_welcome(), mytalk); /*** Loop never returns normally. ***/ fprintf(stderr, "Fini?\n"); } /*************************************************************************** * FUNCTION: chiralify * DESCRIPTION: get SMILES, show chiral isomers ***************************************************************************/ static dt_Handle chiralify(int smilen, char *smiles) { dt_Handle mol, sos, sob; dt_Handle rsos = dt_alloc_seq(); char *str; int lens, n; if (NULL_OB != (mol = dt_smilin(smilen, smiles))) { /*** Get sequence of SMILES of chiral isomers. ***/ sos = du_chiralify(mol); /*** Print isomers as sequence of strings. ***/ if (NULL_OB == sos) { printf(""); } else { dt_reset(sos); for (n = 0; NULL_OB != (sob = dt_next(sos)); n++) { str = dt_stringvalue(&lens, sob); ATS(rsos,str); dt_dealloc(sob); } dt_dealloc(mol); dt_dealloc(sos); } } dt_reset(rsos); return rsos; }