/* 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 */ #include #include #include "dt_smiles.h" #include "du_utils.h" int main(int argc, char *argv[]) { dt_Handle mol; char *smi, *cansmi, *p; int count, goodcount, modcount, lensmi, lencan, len; int iso; /*** Make Isomeric SMILES if "-i" option. ***/ if (argc > 1 && !strcmp("-i", argv[1])) iso = 1; else iso = 0; count = goodcount = modcount = 0; while( NULL != (smi = du_fgetline(&len, stdin)) ) { /*** Permit space or tab between SMILES and name. ***/ p = smi; while (*p && (*p!=' ') && (*p!='\t')) p++; lensmi = p - smi; mol = dt_smilin(lensmi, smi); if (NULL_OB == mol) fprintf(stderr, "ERROR: (dt_smilin) Can't parse \"%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 { /*** Print name if present. ***/ if (*p) printf("%.*s %s\n", lencan, cansmi, p+1); else printf("%.*s\n", lencan, cansmi); goodcount++; if (strncmp(smi, cansmi, lencan)) modcount++; } dt_dealloc(mol); } du_printerrors(stderr, DX_ERR_NOTE); dt_errorclear(); count++; } free(smi); fprintf(stderr, "cansmi results:\n\tin: %d\n\tout: %d\n\tchanged: %d\n", count, goodcount, modcount); return 0; }