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

Reply via email to