/* cansmi.c */
/**********************************************************************
* This source code is public domain, and may be freely distributed, *
* modified, and used for any purpose. IT COMES WITH ABSOLUTELY NO *
* WARRANTY OF ANY KIND. *
**********************************************************************/
/*****************************************************************************
* cansmi.c -- a simple filter to uniquify SMILES
*
* This is the "Hello world!" of Daylight Toolkit programs.
*
* Note on Toolkit strings: Toolkit functions returning strings to C calling
* programs return a pointer to static storage. There is no need to allocate
* or free such strings; their memory is automatically allocated when needed
* and freed when the molecule is deallocated (this is true for components
* of any object). Strings which are part of an object may change or be
* discarded (e.g. when the object is modified or deallocated). In general,
* you should copy strings which you will need later.
*
* The declaration for line (below) sets the limit of the SMILES length
* (the SMILES Toolkit does not impose a limit).
*
* The C-interface to the Toolkit references (almost all) strings by address
* and length (not NULL-terminated strings). See du_smilin() for an example
* of how one might use NULL-terminated string conventions.
*
* Note also that error-handling is done for the sake of the program, not
* for the sake of the Toolkit. For instance, this program does not check
* the success of dt_smilin() before calling dt_cansmiles(). On error,
* dt_smilin() returns NULL_OB; asking for the dt_cansmiles() of NULL_OB is
* a well-defined operation (returns string of length 0), not a "mistake".
*
* BUGS: This program only generates non-isomeric unique SMILES.
* Input overflow (lines >= 2000 chars) is not checked.
* The SMILES "name" is not copied to output.
*/
#include <stdlib.h>
#include <stdio.h>
#include "dt_smiles.h"
#define MAXSMI 2000
main()
{
char line[MAXSMI], *msg, *cansmi;
dt_Handle mol;
int lenmsg, lencan;
/*** Loop over input ***/
while( gets(line) ) {
/*** Parse SMILES, get errors, get & print unique SMILES if able. ***/
mol = dt_smilin(strlen(line), line);
msg = dt_smilinerrtext(&lenmsg);
cansmi = dt_cansmiles(&lencan, mol, 1);
if (0 < lencan) printf("%.*s\n", lencan, cansmi);
/*** On error (or warning), print input and message to stderr. ***/
if (0 < lenmsg || 0 >= lencan) {
if (0 >= lencan)
fprintf(stderr, "Can't make unique SMILES for %s\n", line);
if (0 < lenmsg)
fprintf(stderr, "%.*s\n", lenmsg, msg);
}
/*** Done with molecule. ***/
dt_dealloc(mol);
}
}