/* 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
*
* 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 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.
*
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "dt_smiles.h"
#include "du_utils.h"
main(int argc, char *argv[])
{
dt_Handle mol;
char *smi, *cansmi, *name, *p;
int count, goodcount = 0, modcount = 0, lencan, len;
int iso = 0;
/*** Make Isomeric SMILES if "-i" option. ***/
if (argc > 1 && !strcmp("-i", argv[1])) iso = 1;
for (count = 0; NULL != (smi = du_fgetline(&len, stdin)); ++count ) {
mol = dt_smilin(strlen(smi), smi);
if (NULL_OB == mol) {
fprintf(stderr,
"ERROR: (dt_smilin) Can't make unique SMILES for %s\n", smi);
} else {
cansmi = dt_cansmiles(&lencan, mol, iso);
if (0 >= lencan) {
fprintf(stderr,
"ERROR: (dt_cansmiles) Can't make unique SMILES for %s\n", smi);
} else {
if (NULL != (p = strchr(smi, ' '))) {
name = p + 1;
printf("%.*s %s\n", lencan, cansmi, name);
if (strncmp(smi, cansmi, p - smi)) ++modcount;
}
else {
printf("%.*s\n", lencan, cansmi);
if (strcmp(smi, cansmi)) ++modcount;
}
++goodcount;
}
}
du_printerrors(stderr, DX_ERR_ERROR);
dt_errorclear();
/*** printf("Handles in use = %d\n", dt_vh_count()); DEBUG ***/
dt_dealloc(mol);
}
free(smi);
fprintf(stderr, "SMILES in: %d; SMILES out: %d; SMILES changed: %d\n",
count, goodcount, modcount);
fprintf(stderr, "So long, baby!\n");
}