00001 #ifndef __J2K__FileReader_CPP__
00002 #define __J2K__FileReader_CPP__
00003
00004 #include <j2k/nto/ANSI.hpp>
00005 #include <j2k/nto/FileReader.hpp>
00006 #include <j2k/nto/Track.hpp>
00007 #include <j2k/nto/File.hpp>
00008
00009 FileReader::FileReader( const char* n = "circle.trk" )
00010 {
00011 file = new File( n );
00012 memset( buffer, 0, 4096 );
00013 memset( &trk_init, 0, sizeof( trk_init ) );
00014 memset( &trk_info, 0, sizeof( trk_info ) );
00015 memset( &trk_segment, 0, sizeof( trk_segment ) );
00016 segments = NULL;
00017 len = 0;
00018 }
00019
00020 FileReader::~FileReader()
00021 {
00022 if ( file ) delete file;
00023 if ( segments ) delete[] segments;
00024
00025 file = NULL;
00026 segments = NULL;
00027 }
00028
00029 void FileReader::load()
00030 {
00031 len = file->read( buffer, 4096 );
00032 }
00033
00034 void FileReader::find()
00035 {
00036 char* start = buffer;
00037 char* ends = NULL;
00038 size_t len2 = len;
00039 char buf[4096];
00040 memset( buf, 0, 4096 );
00041
00042
00043 dvect_1D vd1( 30, 0.0f );
00044
00045
00046 dvect_2D vdlength( 2, vd1 );
00047
00048
00049 register int i = 0;
00050
00051 double d[ 10 ];
00052 memset( d, 0, sizeof( double ) * 10 );
00053
00054 for(;;)
00055 {
00056 ends = (char*)memchr( start, '\n', len2 );
00057 if ( ends == NULL ) return;
00058
00059 if ( ends >= buffer+4096 ) return;
00060
00061 size_t l = (size_t)(ends-start+1);
00062 memcpy( buf, start, l );
00063 buf[l] = 0;
00064
00065 len2 += l;
00066
00067 QBColor();
00068 switch( start[0] )
00069 {
00070 case '#': comment( buf, l );
00071 break;
00072
00073 case '%': trk_init = init( buf, l );
00074 if ( segments ) delete[] segments;
00075
00076 size = trk_init.end_bit + 1;
00077 segments = new Track*[ size ];
00078 break;
00079
00080 case '@': trk_info = info( buf, l );
00081
00082 i = (int)trk_info.type;
00083
00084 if ( i > 0 )
00085 {
00086 vdlength[ i ][ trk_info.name ] = trk_info.size;
00087 }
00088
00089 break;
00090
00091 case '$':
00092
00093 trk_segment = track( buf, l );
00094
00095 for( int j = 0; j < trk_segment.max_path; j++ )
00096 {
00097 i = (int)trk_segment.type[ j ];
00098 d[j] = vdlength[ i ][ trk_segment.length_name[ j ] ];
00099 }
00100
00101 i = trk_segment.bit_name;
00102 segments[ i ] = new Track( trk_init, trk_segment, d );
00103 break;
00104
00105 default :
00106 printf( "\nUnknown: %s", buf ); break;
00107 }
00108 start = ends+1;
00109 }
00110 }
00111
00112 Track** FileReader::getTracks() const {
00113 return segments;
00114 }
00115
00116 void FileReader::comment( const char* buf, size_t len )
00117 {
00118 printf( "\nComment: %s \t", buf );
00119 }
00120
00121
00122
00123 track_info_t FileReader::info( const char* buf, size_t len )
00124 {
00125 printf( "\nInfo: %s \t", buf );
00126
00127 size_t i = 0;
00128 char c = 0;
00129
00130 track_info_t info;
00131
00132 memset( &info, 0, sizeof( info ) );
00133
00134 assert ( buf[i] == '@' );
00135
00136 i++;
00137 if ( buf[i] == 'S' || buf[i] == 's' )
00138 {
00139 info.type = TrackType_STRAIGHT;
00140
00141 } else
00142 if ( buf[i] == 'C' || buf[i] == 'c' )
00143 {
00144 info.type = TrackType_CURVED;
00145 } else
00146 {
00147 info.type = TrackType_UNDEFINED;
00148 }
00149
00150 i++;
00151
00152 const char* s = buf+i;
00153 long v = strtol( s, NULL, 10 );
00154
00155 info.name = v;
00156
00157 for( ; i < len; i++ )
00158 {
00159 c = buf[i];
00160 if ( c != '=' ) continue;
00161
00162 const char* s2 = buf+i+1;
00163 double d = strtod( s2, NULL );
00164 info.size = d;
00165 break;
00166 }
00167
00168 printf( "[%d,%ld,%0.6f]",
00169 info.type, info.name,
00170 info.size );
00171
00172 return info;
00173 }
00174
00175 track_init_t FileReader::init( const char* buf, size_t len )
00176 {
00177 printf( "\nInit: %s \t", buf );
00178
00179 size_t i = 0;
00180 char c = 0;
00181
00182 track_init_t info;
00183
00184 memset( &info, -1, sizeof( info ) );
00185
00186 char* delims = { "%-,,;" };
00187 size_t d = 0;
00188
00189 for( i = 0; i < len; i++ )
00190 {
00191 c = buf[i];
00192 if ( c == delims[d] )
00193 {
00194 d++;
00195 i++;
00196 const char* s = buf+i;
00197 long v = strtol( s, NULL, 10 );
00198 switch( d )
00199 {
00200 case 1: info.start_bit = v; break;
00201 case 2: info.end_bit = v; break;
00202 case 3: info.max_left = v; break;
00203 case 4: info.max_right = v; break;
00204 default: break;
00205 }
00206 }
00207 }
00208
00209 QBColor( 14, 0 );
00210 printf( "[%ld,%ld,%ld,%ld]\n",
00211 info.start_bit, info.end_bit,
00212 info.max_left, info.max_right );
00213
00214 return info;
00215 }
00216
00217 void FileReader::parenth( const char* start, size_t len, long* array, size_t sz )
00218 {
00219 char buf[120];
00220 memset( buf, 0, 120 );
00221 memcpy( buf, start, len );
00222
00223 QBColor( 10, 0 );
00224 printf("|%s| ", buf );
00225 QBColor();
00226
00227 register size_t i = 0;
00228 register long v = strtol( start, NULL, 10 );
00229 array[0] = v;
00230
00231 register size_t k = 1;
00232
00233 for( i = 0; i < len; i++ )
00234 {
00235 if ( start[i] != ',' ) continue;
00236
00237 i++;
00238 v = strtol( start+i, NULL, 10 );
00239 array[k] = v;
00240 k++;
00241 }
00242 }
00243
00244 track_segment_t FileReader::track( const char* buf, size_t len )
00245 {
00246 printf( "\nTrack: %s \t", buf );
00247
00248 size_t i = 0;
00249 char c = 0;
00250 size_t index = 0;
00251
00252 size_t sz = 0;
00253
00254 track_segment_t info;
00255
00256 memset( &info, 0, sizeof( info ) );
00257 memset( &info.left, -1, sizeof( info.left ) );
00258 memset( &info.right, -1, sizeof( info.right ) );
00259 memset( &info.switches, -1, sizeof( info.switches ) );
00260
00261 assert ( buf[i] == '$' );
00262 i++;
00263
00264 register long v = strtol( (const char*)(buf+i), NULL, 10 );
00265
00266 info.bit_name = v;
00267
00268 for( ; i < len; i++ )
00269 {
00270 if ( buf[i] == ':' ) break;
00271 }
00272
00273 assert( i < len );
00274
00275 QBColor();
00276 char* pLeftp = (char*)memchr( buf+i, '(', len-i );
00277 char* pRightp = (char*)memchr( buf+i, ')', len-i );
00278
00279 assert( pLeftp != NULL );
00280 assert( pRightp != NULL );
00281
00282 size_t nLeftp = (size_t)(pLeftp - buf);
00283 size_t nRightp = (size_t)(pRightp - buf);
00284
00285 index = 0;
00286 for( i = nLeftp+1; i < nRightp; i++ )
00287 {
00288 while( buf[i] <= ' ' ) { i++; }
00289
00290 if ( buf[i] == 'S' || buf[i] == 's' )
00291 {
00292 info.type[ index ] = TrackType_STRAIGHT;
00293
00294 } else
00295 if ( buf[i] == 'C' || buf[i] == 'c' )
00296 {
00297 info.type[ index ] = TrackType_CURVED;
00298 } else
00299 {
00300 info.type[ index ] = TrackType_UNDEFINED;
00301 }
00302
00303 i++;
00304 const char* s = buf+i;
00305 v = strtol( s, NULL, 10 );
00306
00307 info.length_name[ index ] = v;
00308
00309
00310
00311
00312
00313 info.max_path = index;
00314 index++;
00315 }
00316
00317 char* delims = { ",,,L(),R(),S();" };
00318 size_t d = 0;
00319
00320 for( ; i < len; i++ )
00321 {
00322 c = buf[i];
00323 if ( c == delims[d] )
00324 {
00325 if ( c == 'L' || c == 'l' || c == 'R' || c == 'r' || c == 'S' || c == 'S' )
00326 {
00327 d++;
00328 continue;
00329 }
00330
00331 d++;
00332 i++;
00333 const char* s = buf+i;
00334 v = strtol( s, NULL, 10 );
00335 long* array = NULL;
00336 char* end = NULL;
00337 long length = 0;
00338
00339
00340
00341
00342 switch( d )
00343 {
00344 case 1:
00345 info.max_left = v;
00346 QBColor( 13, 0 );
00347 printf( "info.max_left = %ld ", v );
00348 break;
00349
00350 case 2:
00351 info.max_right = v;
00352 QBColor( 11, 0 );
00353 printf( "info.max_right = %ld ", v );
00354 break;
00355
00356 case 3:
00357
00358
00359
00360 array = &( info.left[0] );
00361 end = strchr( s, ')' );
00362 length = (long)(end - (s + 2) + 1);
00363 if ( length <= 0 ) continue;
00364
00365 i = length-1;
00366
00367
00368 parenth( s+2, (size_t)(length-1), info.left, 10 );
00369 break;
00370
00371 case 6:
00372
00373
00374
00375 array = &( info.right[0] );
00376 end = strchr( s, ')' );
00377
00378 length = (long)(end - (s + 2) + 1);
00379
00380
00381
00382 i = length-1;
00383
00384
00385 parenth( s+3, (size_t)(length-2), info.right, 10 );
00386 break;
00387
00388 case 10:
00389
00390
00391
00392 array = &( info.switches[0] );
00393 end = strchr( s, ')' );
00394
00395 length = (long)(end - (s + 2) + 1);
00396
00397
00398
00399 i = length-1;
00400
00401 sz = (size_t)(length-2);
00402
00403 parenth( s+3, sz, info.switches, 10 );
00404 break;
00405
00406 default:
00407 break;
00408 }
00409 }
00410 }
00411
00412 QBColor( 15, 0);
00413 printf( "[%ld,%d,%ld,%ld,%ld]\nL{",
00414 info.bit_name, info.type[0], info.length_name[0],
00415 info.max_left, info.max_right );
00416 fflush( stdout );
00417
00418
00419 QBColor( 14, 0 );
00420 register int n = 0;
00421 for( n = 0; n < 10; n++ )
00422 {
00423 printf( "%ld", info.left[n] );
00424 if ( n < 9 ) printf( "," );
00425 }
00426
00427 printf( "}\nR{" );
00428
00429 for( n = 0; n < 10; n++ )
00430 {
00431 printf( "%ld", info.right[n] );
00432 if ( n < 9 ) printf( "," );
00433 }
00434
00435 printf( "}\nS{" );
00436
00437 for( n = 0; n < 10; n++ )
00438 {
00439 printf( "%ld", info.switches[n] );
00440 if ( n < 9 ) printf( "," );
00441 }
00442
00443 QBColor( 12, 0 );
00444 printf( "}\n" );
00445 fflush( stdout );
00446
00447 return info;
00448 }
00449
00450
00451 int main( int argc, char* argv[] )
00452 {
00453
00454
00455
00456
00457
00458 printf("\n\n\n");
00459
00460 FileReader* f = NULL;
00461
00462 if ( argc > 1 ) {
00463 f = new FileReader( argv[1] );
00464 } else {
00465 f = new FileReader();
00466 }
00467
00468 f->load();
00469 f->find();
00470
00471 if ( f ) delete f;
00472
00473 QBColor( 7, 0 );
00474 printf("\n\n\n");
00475
00476 fflush( stdout );
00477 return 0;
00478 }
00479 #endif
00480
00481
00482