~ubuntu-branches/debian/sid/gdal/sid

« back to all changes in this revision

Viewing changes to ogr/ogrsf_frmts/dxf/ogrdxfreader.cpp

  • Committer: Package Import Robot
  • Author(s): Francesco Paolo Lovergine
  • Date: 2012-05-07 15:04:42 UTC
  • mfrom: (5.5.16 experimental)
  • Revision ID: package-import@ubuntu.com-20120507150442-2eks97loeh6rq005
Tags: 1.9.0-1
* Ready for sid, starting transition.
* All symfiles updated to latest builds.
* Added dh_numpy call in debian/rules to depend on numpy ABI.
* Policy bumped to 3.9.3, no changes required.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/******************************************************************************
 
2
 * $Id: ogrdxf_diskio.cpp 20278 2010-08-14 15:11:01Z warmerdam $
 
3
 *
 
4
 * Project:  DXF Translator
 
5
 * Purpose:  Implements low level DXF reading with caching and parsing of
 
6
 *           of the code/value pairs. 
 
7
 * Author:   Frank Warmerdam, warmerdam@pobox.com
 
8
 *
 
9
 ******************************************************************************
 
10
 * Copyright (c) 2009, Frank Warmerdam <warmerdam@pobox.com>
 
11
 *
 
12
 * Permission is hereby granted, free of charge, to any person obtaining a
 
13
 * copy of this software and associated documentation files (the "Software"),
 
14
 * to deal in the Software without restriction, including without limitation
 
15
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 
16
 * and/or sell copies of the Software, and to permit persons to whom the
 
17
 * Software is furnished to do so, subject to the following conditions:
 
18
 *
 
19
 * The above copyright notice and this permission notice shall be included
 
20
 * in all copies or substantial portions of the Software.
 
21
 *
 
22
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 
23
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 
24
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 
25
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 
26
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 
27
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 
28
 * DEALINGS IN THE SOFTWARE.
 
29
 ****************************************************************************/
 
30
 
 
31
#include "ogr_dxf.h"
 
32
#include "cpl_conv.h"
 
33
#include "cpl_string.h"
 
34
#include "cpl_csv.h"
 
35
 
 
36
CPL_CVSID("$Id: ogrdxf_diskio.cpp 20278 2010-08-14 15:11:01Z warmerdam $");
 
37
 
 
38
/************************************************************************/
 
39
/*                            OGRDXFReader()                            */
 
40
/************************************************************************/
 
41
 
 
42
OGRDXFReader::OGRDXFReader()
 
43
 
 
44
{
 
45
    fp = NULL;
 
46
 
 
47
    iSrcBufferOffset = 0;
 
48
    nSrcBufferBytes = 0;
 
49
    iSrcBufferFileOffset = 0;
 
50
 
 
51
    nLastValueSize = 0;
 
52
}
 
53
 
 
54
/************************************************************************/
 
55
/*                           ~OGRDXFReader()                            */
 
56
/************************************************************************/
 
57
 
 
58
OGRDXFReader::~OGRDXFReader()
 
59
 
 
60
{
 
61
}
 
62
 
 
63
/************************************************************************/
 
64
/*                             Initialize()                             */
 
65
/************************************************************************/
 
66
 
 
67
void OGRDXFReader::Initialize( VSILFILE *fp )
 
68
 
 
69
{
 
70
    this->fp = fp;
 
71
}
 
72
 
 
73
/************************************************************************/
 
74
/*                          ResetReadPointer()                          */
 
75
/************************************************************************/
 
76
 
 
77
void OGRDXFReader::ResetReadPointer( int iNewOffset )
 
78
 
 
79
{
 
80
    nSrcBufferBytes = 0;
 
81
    iSrcBufferOffset = 0;
 
82
    iSrcBufferFileOffset = iNewOffset;
 
83
    nLastValueSize = 0;
 
84
 
 
85
    VSIFSeekL( fp, iNewOffset, SEEK_SET );
 
86
}
 
87
 
 
88
/************************************************************************/
 
89
/*                           LoadDiskChunk()                            */
 
90
/*                                                                      */
 
91
/*      Load another block (512 bytes) of input from the source         */
 
92
/*      file.                                                           */
 
93
/************************************************************************/
 
94
 
 
95
void OGRDXFReader::LoadDiskChunk()
 
96
 
 
97
{
 
98
    CPLAssert( iSrcBufferOffset >= 0 );
 
99
 
 
100
    if( nSrcBufferBytes - iSrcBufferOffset > 511 )
 
101
        return;
 
102
 
 
103
    if( iSrcBufferOffset > 0 )
 
104
    {
 
105
        CPLAssert( nSrcBufferBytes <= 1024 );
 
106
        CPLAssert( iSrcBufferOffset <= nSrcBufferBytes );
 
107
 
 
108
        memmove( achSrcBuffer, achSrcBuffer + iSrcBufferOffset,
 
109
                 nSrcBufferBytes - iSrcBufferOffset );
 
110
        iSrcBufferFileOffset += iSrcBufferOffset; 
 
111
        nSrcBufferBytes -= iSrcBufferOffset;
 
112
        iSrcBufferOffset = 0;
 
113
    }
 
114
 
 
115
    nSrcBufferBytes += VSIFReadL( achSrcBuffer + nSrcBufferBytes, 
 
116
                                  1, 512, fp );
 
117
    achSrcBuffer[nSrcBufferBytes] = '\0';
 
118
 
 
119
    CPLAssert( nSrcBufferBytes <= 1024 );
 
120
    CPLAssert( iSrcBufferOffset <= nSrcBufferBytes );
 
121
}
 
122
 
 
123
/************************************************************************/
 
124
/*                             ReadValue()                              */
 
125
/*                                                                      */
 
126
/*      Read one type code and value line pair from the DXF file.       */
 
127
/************************************************************************/
 
128
 
 
129
int OGRDXFReader::ReadValue( char *pszValueBuf, int nValueBufSize )
 
130
 
 
131
{
 
132
/* -------------------------------------------------------------------- */
 
133
/*      Make sure we have lots of data in our buffer for one value.     */
 
134
/* -------------------------------------------------------------------- */
 
135
    if( nSrcBufferBytes - iSrcBufferOffset < 512 )
 
136
        LoadDiskChunk();
 
137
 
 
138
    if( nValueBufSize > 512 )
 
139
        nValueBufSize = 512;
 
140
 
 
141
/* -------------------------------------------------------------------- */
 
142
/*      Capture the value code, and skip past it.                       */
 
143
/* -------------------------------------------------------------------- */
 
144
    int iStartSrcBufferOffset = iSrcBufferOffset;
 
145
    int nValueCode = atoi(achSrcBuffer + iSrcBufferOffset);
 
146
 
 
147
    // proceed to newline.
 
148
    while( achSrcBuffer[iSrcBufferOffset] != '\n' 
 
149
           && achSrcBuffer[iSrcBufferOffset] != '\r' 
 
150
           && achSrcBuffer[iSrcBufferOffset] != '\0' ) 
 
151
        iSrcBufferOffset++;
 
152
 
 
153
    if( achSrcBuffer[iSrcBufferOffset] == '\0' )
 
154
        return -1;
 
155
 
 
156
    // skip past newline.  CR, CRLF, or LFCR
 
157
    if( (achSrcBuffer[iSrcBufferOffset] == '\r'
 
158
         && achSrcBuffer[iSrcBufferOffset+1] == '\n' )
 
159
        || (achSrcBuffer[iSrcBufferOffset] == '\n'
 
160
            && achSrcBuffer[iSrcBufferOffset+1] == '\r' ) )
 
161
        iSrcBufferOffset += 2;
 
162
    else
 
163
        iSrcBufferOffset += 1;
 
164
 
 
165
    if( achSrcBuffer[iSrcBufferOffset] == '\0' )
 
166
        return -1;
 
167
 
 
168
/* -------------------------------------------------------------------- */
 
169
/*      Capture the value string.                                       */
 
170
/* -------------------------------------------------------------------- */
 
171
    int iEOL = iSrcBufferOffset;
 
172
 
 
173
    // proceed to newline.
 
174
    while( achSrcBuffer[iEOL] != '\n' 
 
175
           && achSrcBuffer[iEOL] != '\r' 
 
176
           && achSrcBuffer[iEOL] != '\0' ) 
 
177
        iEOL++;
 
178
 
 
179
    if( achSrcBuffer[iEOL] == '\0' )
 
180
        return -1;
 
181
 
 
182
    if( (iEOL - iSrcBufferOffset) > nValueBufSize-1 )
 
183
    {
 
184
        strncpy( pszValueBuf, achSrcBuffer + iSrcBufferOffset, 
 
185
                 nValueBufSize-1 );
 
186
        pszValueBuf[nValueBufSize-1] = '\0';
 
187
 
 
188
        CPLDebug( "DXF", "Long line truncated to %d characters.\n%s...",
 
189
                  nValueBufSize-1,
 
190
                  pszValueBuf );
 
191
    }
 
192
    else
 
193
    {
 
194
        strncpy( pszValueBuf, achSrcBuffer + iSrcBufferOffset, 
 
195
                 iEOL - iSrcBufferOffset );
 
196
        pszValueBuf[iEOL - iSrcBufferOffset] = '\0';
 
197
    }
 
198
 
 
199
    iSrcBufferOffset = iEOL;
 
200
 
 
201
    // skip past newline.  CR, CRLF, or LFCR
 
202
    if( (achSrcBuffer[iSrcBufferOffset] == '\r'
 
203
         && achSrcBuffer[iSrcBufferOffset+1] == '\n' )
 
204
        || (achSrcBuffer[iSrcBufferOffset] == '\n'
 
205
            && achSrcBuffer[iSrcBufferOffset+1] == '\r' ) )
 
206
        iSrcBufferOffset += 2;
 
207
    else
 
208
        iSrcBufferOffset += 1;
 
209
 
 
210
/* -------------------------------------------------------------------- */
 
211
/*      Record how big this value was, so it can be unread safely.      */
 
212
/* -------------------------------------------------------------------- */
 
213
    nLastValueSize = iSrcBufferOffset - iStartSrcBufferOffset;
 
214
 
 
215
/* -------------------------------------------------------------------- */
 
216
/*      Is this a comment?  If so, tail recurse to get another line.    */
 
217
/* -------------------------------------------------------------------- */
 
218
    if( nValueCode == 999 )
 
219
        return ReadValue(pszValueBuf,nValueBufSize);
 
220
    else
 
221
        return nValueCode;
 
222
}
 
223
 
 
224
/************************************************************************/
 
225
/*                            UnreadValue()                             */
 
226
/*                                                                      */
 
227
/*      Unread the last value read, accomplished by resetting the       */
 
228
/*      read pointer.                                                   */
 
229
/************************************************************************/
 
230
 
 
231
void OGRDXFReader::UnreadValue()
 
232
 
 
233
{
 
234
    CPLAssert( iSrcBufferOffset >= nLastValueSize );
 
235
    CPLAssert( nLastValueSize > 0 );
 
236
 
 
237
    iSrcBufferOffset -= nLastValueSize;
 
238
 
 
239
    nLastValueSize = 0;
 
240
}
 
241