"Fossies" - the Fresh Open Source Software Archive 
Member "pfstools-2.2.0/src/matlab/pfsput.cpp" (12 Aug 2021, 6607 Bytes) of package /linux/privat/pfstools-2.2.0.tgz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
1 /**
2 * @brief Write frame to pfs stream in MATLAB
3 *
4 * This file is a part of PFSTOOLS package.
5 * ----------------------------------------------------------------------
6 * Copyright (C) 2003,2004 Rafal Mantiuk and Grzegorz Krawczyk
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 * ----------------------------------------------------------------------
22 *
23 * @author Rafal Mantiuk, <mantiuk@mpi-sb.mpg.de>
24 *
25 * $Id: pfsput.cpp,v 1.6 2008/05/06 17:11:35 rafm Exp $
26 */
27
28 #include "compatibility.h"
29
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <fcntl.h>
33
34 #include <list>
35
36 #include "mex.h"
37 #include "mex_utils.h"
38
39 #define SCRIPT_NAME "pfsput"
40 #define error mexErrMsgTxt
41
42 #include <pfs.h>
43
44
45 void mexFunction(int nlhs, mxArray *plhs[],
46 int nrhs, const mxArray *prhs[])
47 {
48
49 /* Check for proper number of arguments. */
50 if( nrhs != 1 || !mxIsStruct( prhs[0] ) )
51 error(SCRIPT_NAME ": Improper usage!");
52
53 const mxArray *pfs_stream = prhs[0];
54
55 mxArray *f_fid = mxGetField( pfs_stream, 0, "FID" );
56 if( f_fid == NULL || !is_mex_scalar( f_fid ) )
57 {
58 error( SCRIPT_NAME ": FH field missing in the structure or it has wrong type");
59 }
60
61 int fid = (int)get_mex_double( f_fid );
62
63 // Check mode
64 {
65 mxArray *f_mode = mxGetField( pfs_stream, 0, "MODE" );
66 if( f_mode == NULL ) {
67 error( SCRIPT_NAME ": MODE field missing in the structure or it has wrong type");
68 }
69 if( strcmp( "W", get_mex_string( f_mode ) ) ) {
70 error( SCRIPT_NAME ": Can not write to the stream that is open for reading." );
71 }
72 }
73
74 // Get width & height
75 int width, height;
76 {
77 mxArray *f_cols, *f_rows;
78 f_cols = mxGetField( pfs_stream, 0, "columns" );
79 f_rows = mxGetField( pfs_stream, 0, "rows" );
80
81 if( !is_mex_scalar( f_cols ) || !is_mex_scalar( f_rows ) )
82 {
83 error( SCRIPT_NAME ": 'rows' and 'columns' fields missing in the structure or it have wrong type");
84 }
85 width = (int)get_mex_double( f_cols );
86 height = (int)get_mex_double( f_rows );
87 }
88
89 // Get channels
90 int ch_count;
91 mxArray *f_channels;
92 {
93 f_channels = mxGetField( pfs_stream, 0, "channels" );
94 if( f_channels == NULL || !mxIsStruct( f_channels ) )
95 error( SCRIPT_NAME ": 'channels' field missing in the structure or it has wrong type");
96 ch_count = mxGetNumberOfFields( f_channels );
97 }
98
99 try {
100 pfs::DOMIO ctx;
101 pfs::Frame *frame = ctx.createFrame( width, height );
102
103 // For each channel in the 'channels' map
104 for( int ch = 0; ch < ch_count; ch++ ) {
105 const char *channelName = mxGetFieldNameByNumber( f_channels, ch );
106
107 mxArray *f_data = mxGetFieldByNumber( f_channels, 0, ch );
108
109 if( !(mxIsDouble( f_data ) || mxIsSingle( f_data )) || mxIsComplex( f_data ) ) {
110 throw pfs::Exception( "all channels must be given as real matrices" );
111 }
112
113 if( mxGetM( f_data ) != height || mxGetN( f_data ) != width ) {
114 throw pfs::Exception( "size of the channel must be the same as given in pfsopen" );
115 }
116
117 pfs::Channel *pfsChannel = frame->createChannel( channelName );
118
119 // Copy matrix to pfs::Channel
120 copy_mex_to_pfschannel( f_data, pfsChannel );
121 }
122
123 // Copy frame tags
124 {
125 mxArray *tags, *f_rows;
126 tags = mxGetField( pfs_stream, 0, "tags" );
127 if( tags != NULL ) {
128 if( !mxIsStruct( f_channels ) )
129 error( SCRIPT_NAME ": 'tags' field has wrong type");
130 int tag_count = mxGetNumberOfFields( tags );
131
132 for( int t = 0; t < tag_count; t++ ) {
133 const char *tag_name = mxGetFieldNameByNumber( tags, t );
134 mxArray *tag_value = mxGetFieldByNumber( tags, 0, t );
135
136 // printf( "tag: %s = %s\n", tag_name, get_mex_string( tag_value ) );
137 frame->getTags()->setString( tag_name, get_mex_string( tag_value ) );
138
139 }
140 }
141
142
143 }
144
145 /* Not implemented - hopefuly nobody uses this
146
147 // Copy channel tags
148 {
149 Octave_map::const_iterator itChTags = pfsStream.seek( "channelTags" );
150 if( itChTags != pfsStream.end() ) {
151 if( !pfsStream.contents( itChTags )(0).isstruct() )
152 {
153 throw pfs::Exception( "'channelTags' field must be a structure" );
154 }
155 Octave_map tagChannels = pfsStream.contents( itChTags )(0).map_value();
156 for( Octave_map::iterator itCh = tagChannels.begin(); itCh != tagChannels.end(); itCh++ ) {
157 std::string channelName = tagChannels.key(itCh);
158 if( !tagChannels.contents( itCh )(0).isstruct() ) {
159 throw pfs::Exception( "each channelTags file must be a structure" );
160 }
161 pfs::Channel *pfsChannel = frame->getChannel( channelName.c_str() );
162 if( pfsChannel == NULL ) {
163 throw pfs::Exception( "can not set channel tag if channel is missing" );
164 }
165
166 Octave_map tags = tagChannels.contents( itCh )(0).map_value();
167 for( Octave_map::iterator itTag = tags.begin(); itTag != tags.end(); itTag++ ) {
168 std::string tagName = tags.key(itTag);
169 if( !tags.contents( itTag )(0).is_string() )
170 throw pfs::Exception( "all channel tags must be given as strings" );
171 std::string tagValue = tags.contents( itTag )(0).string_value();
172 pfsChannel->getTags()->setString( tagName.c_str(), tagValue.c_str() );
173 }
174 }
175 }
176
177 }
178 */
179
180
181 // FILE *fh = fdopen( fid, "a" );
182 FILE *fh = fdopen( dup( fid ), "w" );
183 if( fh == NULL )
184 error( SCRIPT_NAME ": Cannot open file for writing" );
185
186 ctx.writeFrame( frame, fh );
187 ctx.freeFrame( frame );
188 fclose( fh );
189
190 //fsync( fid );
191
192 }
193 catch( pfs::Exception ex )
194 {
195 char error_message[100];
196 sprintf( error_message, "%s: %s", SCRIPT_NAME, ex.getMessage() );
197 error( error_message );
198 }
199
200 }
201
202