MapTools.org

[Shapelib] DBFCloneEmtpy bug and resolution

shapelib@lists.maptools.org shapelib@lists.maptools.org
Tue, 16 Mar 2004 11:59:57 -0500
This is a multipart message in MIME format.
--=_alternative 005D61D885256E59_=
Content-Type: text/plain; charset="US-ASCII"

Frank, et al.:

I believe I have found and resolved a bug in shapelib's DBFCloneEmpty 
function.  I was finding that dbf files created with this function were 
improperly created and could not be opened, because the "cloned" files 
were missing a 0x0d-valued byte at the end of the header section.  As it 
turns out, the culprit was the assignment of nHeaderLength in 
DBFCloneEmpty:

        newDBF->nHeaderLength = 32 * (psDBF->nFields+1);  // incorrect
 
When a new dbf is created with DBFCreate, nHeaderLength is given an 
initial value of:

        psDBF->nHeaderLength = 33;
 
Subsequent calls to DBFAddField increment nHeaderLength by 32, as

        psDBF->nHeaderLength += 32;
 
Therefore, the correct assignment of nHeaderLength in DBFCloneEmpty is:

        newDBF->nHeaderLength = 33 + 32 * (psDBF->nFields);  // correct
 

After this modification, cloded dbf files are written correctly.

Best regards,

David Gancarz




--=_alternative 005D61D885256E59_=
Content-Type: text/html; charset="US-ASCII"


<br><font size=2 face="sans-serif">Frank, et al.:</font>
<br>
<br><font size=2 face="sans-serif">I believe I have found and resolved
a bug in shapelib's DBFCloneEmpty function. &nbsp;I was finding that dbf
files created with this function were improperly created and could not
be opened, because the &quot;cloned&quot; files were missing a 0x0d-valued
byte at the end of the header section. &nbsp;As it turns out, the culprit
was the assignment of nHeaderLength in DBFCloneEmpty:</font>
<br>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; newDBF-&gt;nHeaderLength
= 32 * (psDBF-&gt;nFields+1); &nbsp;// incorrect</font>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; </font>
<br><font size=2 face="sans-serif">When a new dbf is created with DBFCreate,
nHeaderLength is given an initial value of:</font>
<br>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; psDBF-&gt;nHeaderLength
= 33;</font>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; </font>
<br><font size=2 face="sans-serif">Subsequent calls to DBFAddField increment
nHeaderLength by 32, as</font>
<br>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; psDBF-&gt;nHeaderLength
+= 32;</font>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; </font>
<br><font size=2 face="sans-serif">Therefore, the correct assignment of
nHeaderLength in DBFCloneEmpty is:</font>
<br>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; newDBF-&gt;nHeaderLength
= 33 + 32 * (psDBF-&gt;nFields); &nbsp;// correct</font>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; </font>
<br>
<br><font size=2 face="sans-serif">After this modification, cloded dbf
files are written correctly.</font>
<br>
<br><font size=2 face="sans-serif">Best regards,</font>
<br>
<br><font size=2 face="sans-serif">David Gancarz</font>
<br>
<br>
<br>
<br>
--=_alternative 005D61D885256E59_=--


This archive was generated by Pipermail.