Main Page   Packages   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Search  

C:/temp/src/j2k/nto/bakJuly/FileReader.cpp

Go to the documentation of this file.
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 // vd2[ dir ][ speed ]
00043 dvect_1D  vd1( 30, 0.0f );
00044 
00045 // vdlength[ straight/curved ][ length ]
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 // Should verify tokens delims and validate the order of the sequence !
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 //      QBColor( 10, 0 );  
00310 //      printf("[%c%c|",    buf[i-1], buf[i] );
00311 //      printf("%d%ld]\n\n", info.type[index], v );
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 //        QBColor( 14,0 );
00340 //        printf("d=[%d] s=[%s]\n", d, s );
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 //            QBColor( 10, 0 );
00358 //            printf( "Case 3 \n" );
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 //            printf( "[%s]", s+2 );
00368             parenth( s+2, (size_t)(length-1), info.left, 10 );
00369           break;
00370 
00371           case 6:
00372 //            QBColor( 15, 0 );
00373 //            printf( "Case 6 \n" );
00374 
00375             array = &( info.right[0] );
00376             end = strchr( s, ')' );
00377 
00378             length = (long)(end - (s + 2) + 1);
00379 //            if ( length <= 0 ) continue;
00380 
00381             
00382             i = length-1;
00383 
00384 //            printf( "[%s]", s+3 );
00385             parenth( s+3, (size_t)(length-2), info.right, 10 );
00386           break;
00387 
00388           case 10:
00389 //            QBColor( 15, 0 );
00390 //            printf( "Case 10 \n" );
00391 
00392             array = &( info.switches[0] );
00393             end = strchr( s, ')' );
00394 
00395             length = (long)(end - (s + 2) + 1);
00396 //            if ( length <= 0 ) continue;
00397 
00398             
00399             i = length-1;
00400 
00401             sz = (size_t)(length-2); 
00402 //            printf( "[%s]%d]", s+3, sz );
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 //  printf( "%d", argc );
00455 //  for( int i = 0; i < argc; i++ )
00456 //   printf( "[%s]", argv[i] );
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 

Generated on Sun Oct 14 18:46:36 2001 for Standard J2K Library by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001