Skip to content

Commit 453edd1

Browse files
committed
Merge remote-tracking branch 'fieldml/master' into zinc_mods
2 parents c689a73 + 90ccba6 commit 453edd1

14 files changed

+244
-46
lines changed

Fortran/InterfaceGen.py

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ def processLine( line, state ):
203203
return state
204204

205205

206-
def processFile():
206+
def processFiles():
207207
headerFile = open( "../core/src/fieldml_api.h" )
208208

209209
state = ParseState.InHeader
@@ -235,6 +235,37 @@ def processFile():
235235

236236
headerFile.close()
237237

238+
headerFile = open( "../io/src/FieldmlIoApi.h" )
239+
240+
state = ParseState.InHeader
241+
inComment = False
242+
243+
for line in headerFile:
244+
startSegment = 0
245+
246+
if( inComment ):
247+
pos = line.find( "*/" )
248+
if( pos == -1 ):
249+
continue
250+
inComment = False
251+
startSegment = pos + 2
252+
253+
#Does not cope with mixing line and block comments.
254+
endSegment = line.find( "/*", startSegment )
255+
while( endSegment != -1 ):
256+
state = processLine( line[ startSegment : endSegment ], state )
257+
startSegment = line.find( "*/", endSegment + 2 )
258+
if( startSegment == -1 ):
259+
break
260+
endSegment = line.find( "/*", startSegment )
261+
262+
if( startSegment == -1 ):
263+
inComment = True
264+
else:
265+
state = processLine( line[ startSegment : ], state )
266+
267+
headerFile.close()
268+
238269

239270
writeHeader()
240271

@@ -261,4 +292,4 @@ def processFile():
261292

262293
writeFooter()
263294

264-
processFile()
295+
processFiles()

core/src/FieldmlSession.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,46 @@ FieldmlRegion *FieldmlSession::addResourceRegion( string href, string name )
200200
return resourceRegion;
201201
}
202202

203+
FieldmlRegion *FieldmlSession::addResourceRegionFromBuffer( const void *buffer, unsigned int buffer_length, string name )
204+
{
205+
if((buffer == 0) || (1 > buffer_length))
206+
{
207+
return 0;
208+
}
209+
210+
//NOTE: This will be insufficient when the region name starts being used.
211+
if( FmlUtil::contains( importHrefStack, name ) )
212+
{
213+
addError( "Recursive import involving " + name );
214+
return NULL;
215+
}
216+
217+
importHrefStack.push_back( name );
218+
219+
FieldmlRegion *resourceRegion = new FieldmlRegion( name, name, "", objects );
220+
FieldmlRegion *currentRegion = region;
221+
region = resourceRegion;
222+
223+
int result = 0;
224+
225+
result = FieldmlDOM::parseFieldmlString( (const char *)buffer, "memory buffer", "memory", this, getSessionHandle() );
226+
227+
importHrefStack.pop_back();
228+
229+
region = currentRegion;
230+
231+
if( ( result != 0 ) || ( getErrorCount() != 0 ) )
232+
{
233+
delete resourceRegion;
234+
resourceRegion = NULL;
235+
}
236+
else
237+
{
238+
regions.push_back( resourceRegion );
239+
}
240+
241+
return resourceRegion;
242+
}
203243

204244
void FieldmlSession::pushErrorContext( const char *file, const int line, const char *function )
205245
{

core/src/FieldmlSession.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,8 @@ class FieldmlSession :
117117

118118
FieldmlRegion *addResourceRegion( std::string location, std::string name );
119119

120+
FieldmlRegion *addResourceRegionFromBuffer( const void *buffer, unsigned int buffer_length, std::string name );
121+
120122
FieldmlRegion *addNewRegion( std::string location, std::string name );
121123

122124
FieldmlRegion *getRegion( std::string location, std::string name );

core/src/fieldml_api.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,31 @@ FmlSessionHandle Fieldml_CreateFromFile( const char * filename )
514514
return session->getSessionHandle();
515515
}
516516

517+
FmlSessionHandle Fieldml_CreateFromBuffer( const void *buffer, unsigned int buffer_length, const char * name )
518+
{
519+
FieldmlSession *session = new FieldmlSession();
520+
ErrorContextAutostack bob( session, __FILE__, __LINE__, __ECA_FUNC__ );
521+
522+
if( buffer == NULL || 1 > buffer_length )
523+
{
524+
session->setError( FML_ERR_INVALID_PARAMETER_1, "Cannot create FieldML session. Invalid buffer." );
525+
}
526+
else
527+
{
528+
session->region = session->addResourceRegionFromBuffer( buffer, buffer_length, name );
529+
if( session->region == NULL )
530+
{
531+
session->setError( FML_ERR_READ_ERR, "Cannot create FieldML session. Invalid document or read error." );
532+
}
533+
else
534+
{
535+
session->region->finalize();
536+
}
537+
}
538+
539+
return session->getSessionHandle();
540+
}
541+
517542

518543
FmlSessionHandle Fieldml_Create( const char * location, const char * name )
519544
{

core/src/fieldml_api.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,8 @@ extern "C" {
273273
*/
274274
FmlSessionHandle Fieldml_CreateFromFile( const char * filename );
275275

276+
FmlSessionHandle Fieldml_CreateFromBuffer( const void *buffer, unsigned int buffer_length, const char * name );
277+
276278

277279
/**
278280
* Creates an empty FieldML handle.

core/src/string_const.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -180,16 +180,17 @@ char *strdupS( const char *str )
180180

181181
const string getDirectory( const string filename )
182182
{
183-
size_t index;
184-
185-
index = filename.rfind( NIX_PATH_SEP );
183+
size_t index = filename.rfind( NIX_PATH_SEP );
184+
186185
#ifdef WIN32
187-
if( ( filename.rfind( WIN_PATH_SEP ) > index ) || ( index == string::npos ) )
186+
size_t winIndex = filename.rfind( WIN_PATH_SEP );
187+
if( ( winIndex != string::npos ) &&
188+
(( index == string::npos ) || (winIndex > index)))
188189
{
189-
index = filename.rfind( WIN_PATH_SEP );
190+
index = winIndex;
190191
}
191192
#endif
192-
193+
193194
if( index == string::npos )
194195
{
195196
return string();

io/src/ArrayDataReader.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@
4848

4949
using namespace std;
5050

51-
ArrayDataReader * ArrayDataReader::create( FieldmlIoContext *context, const string root, FmlObjectHandle source )
51+
ArrayDataReader * ArrayDataReader::createInternal( FieldmlIoContext *context, const string root,
52+
FmlObjectHandle source, void *buffer )
5253
{
5354
ArrayDataReader *reader = NULL;
5455

@@ -73,7 +74,7 @@ ArrayDataReader * ArrayDataReader::create( FieldmlIoContext *context, const stri
7374
}
7475
else if( format == StringUtil::PLAIN_TEXT_NAME )
7576
{
76-
reader = TextArrayDataReader::create( context, root, source );
77+
reader = TextArrayDataReader::create( context, root, source, buffer );
7778
}
7879
else
7980
{
@@ -83,6 +84,17 @@ ArrayDataReader * ArrayDataReader::create( FieldmlIoContext *context, const stri
8384
return reader;
8485
}
8586

87+
ArrayDataReader * ArrayDataReader::create( FieldmlIoContext *context, const string root, FmlObjectHandle source )
88+
{
89+
return ArrayDataReader::createInternal( context, root, source, 0 );
90+
}
91+
92+
93+
ArrayDataReader * ArrayDataReader::createWithBuffer( FieldmlIoContext *context, const string root, FmlObjectHandle source, void *buffer )
94+
{
95+
return ArrayDataReader::createInternal( context, root, source, buffer );
96+
}
97+
8698

8799
ArrayDataReader::ArrayDataReader( FieldmlIoContext *_context ) :
88100
context( _context )

io/src/ArrayDataReader.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,23 @@
4444

4545
#include "FieldmlIoContext.h"
4646

47+
enum ArrayDataSourceType
48+
{
49+
ARRAY_DATA_SOURCE_UNKNOWN,
50+
ARRAY_DATA_SOURCE_DEFAULT,
51+
ARRAY_DATA_SOURCE_BUFFER,
52+
};
53+
4754
class ArrayDataReader
4855
{
4956
protected:
5057
FieldmlIoContext * const context;
5158

5259
ArrayDataReader( FieldmlIoContext *_context );
5360

61+
static ArrayDataReader *createInternal( FieldmlIoContext *context, const std::string root,
62+
FmlObjectHandle source, void *buffer );
63+
5464
public:
5565
virtual FmlIoErrorNumber readIntSlab( const int *offsets, const int *sizes, int *valueBuffer ) = 0;
5666

@@ -63,7 +73,10 @@ class ArrayDataReader
6373

6474
virtual ~ArrayDataReader();
6575

66-
static ArrayDataReader *create( FieldmlIoContext *context, const std::string root, FmlObjectHandle source );
76+
static ArrayDataReader *create( FieldmlIoContext *context, const std::string root, FmlObjectHandle source);
77+
78+
static ArrayDataReader *createWithBuffer( FieldmlIoContext *context, const std::string root,
79+
FmlObjectHandle source, void *buffer );
6780
};
6881

6982

io/src/FieldmlIoApi.cpp

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ FmlIoErrorNumber FieldmlIo_GetLastError()
7272
return FieldmlIoSession::getSession().getLastError();
7373
}
7474

75-
76-
FmlReaderHandle Fieldml_OpenReader( FmlSessionHandle handle, FmlObjectHandle objectHandle )
75+
FmlReaderHandle Fieldml_OpenReaderInternal( FmlSessionHandle handle, FmlObjectHandle objectHandle,
76+
ArrayDataSourceType sourceType, void *buffer)
7777
{
7878
if( Fieldml_IsObjectLocal( handle, objectHandle, 0 ) != 1 )
7979
{
@@ -92,7 +92,11 @@ FmlReaderHandle Fieldml_OpenReader( FmlSessionHandle handle, FmlObjectHandle obj
9292
}
9393
else
9494
{
95-
reader = ArrayDataReader::create( FieldmlIoSession::getSession().createContext( handle ), root, objectHandle );
95+
if (sourceType == ARRAY_DATA_SOURCE_DEFAULT)
96+
reader = ArrayDataReader::create( FieldmlIoSession::getSession().createContext( handle ), root, objectHandle);
97+
else
98+
reader = ArrayDataReader::createWithBuffer( FieldmlIoSession::getSession().createContext( handle ),
99+
root, objectHandle, buffer);
96100
}
97101
Fieldml_FreeString(region_string);
98102
}
@@ -111,6 +115,16 @@ FmlReaderHandle Fieldml_OpenReader( FmlSessionHandle handle, FmlObjectHandle obj
111115
}
112116

113117

118+
FmlReaderHandle Fieldml_OpenReader( FmlSessionHandle handle, FmlObjectHandle objectHandle)
119+
{
120+
return Fieldml_OpenReaderInternal(handle, objectHandle, ARRAY_DATA_SOURCE_DEFAULT, 0);
121+
}
122+
123+
FmlReaderHandle Fieldml_OpenReaderWithBuffer( FmlSessionHandle handle, FmlObjectHandle objectHandle, void *buffer)
124+
{
125+
return Fieldml_OpenReaderInternal(handle, objectHandle, ARRAY_DATA_SOURCE_BUFFER, buffer);
126+
}
127+
114128
FmlIoErrorNumber Fieldml_ReadIntSlab( FmlReaderHandle readerHandle, const int *offsets, const int *sizes, int *valueBuffer )
115129
{
116130
ArrayDataReader *reader = FieldmlIoSession::getSession().handleToReader( readerHandle );

io/src/FieldmlIoApi.h

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@ typedef int32_t FmlWriterHandle; ///< A handle to a data writer.
7777

7878
typedef int32_t FmlIoErrorNumber; ///< A FieldML IO library error code.
7979

80-
8180
/*
8281
8382
Constants
@@ -104,6 +103,15 @@ typedef int32_t FmlIoErrorNumber; ///< A FieldML IO library error
104103
105104
*/
106105

106+
enum FieldmlStreamRequestStatus
107+
{
108+
FML_STREAM_REQUEST_STATUS_UNKNOWN,
109+
FML_STREAM_REQUEST_STATUS_OK,
110+
FML_STREAM_REQUEST_STATUS_START,
111+
FML_STREAM_REQUEST_STATUS_REQUESTED,
112+
FML_STREAM_REQUEST_STATUS_ERROR,
113+
FML_STREAM_REQUEST_STATUS_END,
114+
};
107115

108116
/*
109117
@@ -124,6 +132,17 @@ extern "C" {
124132
*/
125133
FmlReaderHandle Fieldml_OpenReader( FmlSessionHandle handle, FmlObjectHandle objectHandle );
126134

135+
/**
136+
* Creates a new reader for the given data source's raw data. Fieldml_CloseReader() should be called
137+
* when the caller no longer needs to use it. Reader created using this function will use an
138+
* external callback function user set later to read the required data in.
139+
*
140+
* \see Fieldml_ReadIntSlab
141+
* \see Fieldml_ReadDoubleSlab
142+
* \see Fieldml_CloseReader
143+
* \see Fieldml_SetStreamRequestCallback
144+
*/
145+
FmlReaderHandle Fieldml_OpenReaderWithBuffer( FmlSessionHandle handle, FmlObjectHandle objectHandle, void *buffer);
127146

128147
/**
129148
* Reads data from the multi-dimensional array specified by the given offsets and sizes into the given buffer. The first

io/src/Hdf5ArrayDataReader.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,11 @@ class Hdf5ArrayDataReader :
7777

7878
virtual FmlIoErrorNumber readBooleanSlab( const int *offsets, const int *sizes, FmlBoolean *valueBuffer );
7979

80+
virtual FmlIoErrorNumber setStreamRequestCallback( Fieldml_StreamRequestCallbackFunction function, void *user_data_in )
81+
{
82+
return 0;
83+
}
84+
8085
virtual FmlIoErrorNumber close();
8186

8287
virtual ~Hdf5ArrayDataReader();

0 commit comments

Comments
 (0)