Craig A. James wrote: > Craig A. James wrote: >> Chris Morley wrote: >>> In the V2000 MOL file interpreter in the trunk code (potentially for >>> v2.3.0), numbers need to be right-justified in their fields. So the >>> first molecule in the drugbank dataset ( http://www.drugbank.ca/ ) >>> fails silently with 0 atoms, 0 bonds. I cannot find a justification >>> requirement for any number in the specification. Is there a reason for >>> OB to reject left-justified numbers? (I think v2.2.3 accepted them.) >> That may be a side effect of some code I added a while back to prevent >> core dumps on badly formed SD files. It wasn't checking these fields, >> and non-numeric data and other junk would make it segfault. I'll look >> at the CTAB spec and see if there's any requirement one way or the >> other, but it seems like a harmless enough "extension" even if the spec >> doesn't allow it. > > I looked through the MDL V2000 CTAB spec, and there's nothing that says a > field has to be right justified. Since the original software spec was > designed for FORTRAN code, I thought I'd check the FORTRAN spec, which > specifically says that trailing blanks in an integer field are ignored. > > http://www.fortran.com/F77_std/rjcnf0001-sh-13.html#sh-13.5.8 > > "If a BN edit descriptor [i.e. a blank character] is encountered in a format > specification, all such blank characters in succeeding numeric input fields > are ignored. The effect of ignoring blanks is to treat the input field as if > blanks had been removed, the remaining portion of the field right-justified, > and the blanks replaced as leading blanks. However, a field of all blanks has > the value zero." > > So if we wanted to go with the original spirit of the CTAB spec, we'd allow > blanks after a number, and an all-blank field is the same as a "0" field. > > Chris, can you test this on your file? > > Craig > > $ svn diff mdlformat.cpp > Index: mdlformat.cpp > =================================================================== > --- mdlformat.cpp (revision 3495) > +++ mdlformat.cpp (working copy) > @@ -1388,7 +1388,7 @@ > char *end; > if (s == NULL) return 0; > int n = strtol(s, &end, 10); > - if (*end != '\0') return 0; > + if (*end != '\0' && *end != ' ') return 0; > return n; > } > > @@ -1397,7 +1397,7 @@ > char *end; > if (s == NULL) return 0; > int n = strtoul(s, &end, 10); > - if (*end != '\0') return 0; > + if (*end != '\0' && *end != ' ') return 0; > return n; > } > }
This does the job. I have committed the changes to trunk. Chris ------------------------------------------------------------------------------ SOLARIS 10 is the OS for Data Centers - provides features such as DTrace, Predictive Self Healing and Award Winning ZFS. Get Solaris 10 NOW http://p.sf.net/sfu/solaris-dev2dev _______________________________________________ OpenBabel-Devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/openbabel-devel
