00001
00021 #include <stdio.h>
00022 #include "extra.h"
00023
00027
00028 struct ProgressBarStruct
00029 {
00030 int nItemsNext;
00031 int nItemsTotal;
00032 int posTotal;
00033 int posCur;
00034 FILE * pFile;
00035 };
00036
00037 static void Extra_ProgressBarShow( ProgressBar * p, char * pString );
00038 static void Extra_ProgressBarClean( ProgressBar * p );
00039
00043
00058 ProgressBar * Extra_ProgressBarStart( FILE * pFile, int nItemsTotal )
00059 {
00060 ProgressBar * p;
00061 extern int Abc_FrameShowProgress( void * p );
00062 extern void * Abc_FrameGetGlobalFrame();
00063
00064 if ( !Abc_FrameShowProgress(Abc_FrameGetGlobalFrame()) ) return NULL;
00065 p = ALLOC( ProgressBar, 1 );
00066 memset( p, 0, sizeof(ProgressBar) );
00067 p->pFile = pFile;
00068 p->nItemsTotal = nItemsTotal;
00069 p->posTotal = 78;
00070 p->posCur = 1;
00071 p->nItemsNext = (int)((7.0+p->posCur)*p->nItemsTotal/p->posTotal);
00072 Extra_ProgressBarShow( p, NULL );
00073 return p;
00074 }
00075
00087 void Extra_ProgressBarUpdate_int( ProgressBar * p, int nItemsCur, char * pString )
00088 {
00089 if ( p == NULL ) return;
00090 if ( nItemsCur < p->nItemsNext )
00091 return;
00092 if ( nItemsCur >= p->nItemsTotal )
00093 {
00094 p->posCur = 78;
00095 p->nItemsNext = 0x7FFFFFFF;
00096 }
00097 else
00098 {
00099 p->posCur += 7;
00100 p->nItemsNext = (int)((7.0+p->posCur)*p->nItemsTotal/p->posTotal);
00101 }
00102 Extra_ProgressBarShow( p, pString );
00103 }
00104
00105
00117 void Extra_ProgressBarStop( ProgressBar * p )
00118 {
00119 if ( p == NULL ) return;
00120 Extra_ProgressBarClean( p );
00121 FREE( p );
00122 }
00123
00135 void Extra_ProgressBarShow( ProgressBar * p, char * pString )
00136 {
00137 int i;
00138 if ( p == NULL ) return;
00139 if ( pString )
00140 fprintf( p->pFile, "%s ", pString );
00141 for ( i = (pString? strlen(pString) + 1 : 0); i < p->posCur; i++ )
00142 fprintf( p->pFile, "-" );
00143 if ( i == p->posCur )
00144 fprintf( p->pFile, ">" );
00145 for ( i++ ; i <= p->posTotal; i++ )
00146 fprintf( p->pFile, " " );
00147 fprintf( p->pFile, "\r" );
00148 fflush( stdout );
00149 }
00150
00162 void Extra_ProgressBarClean( ProgressBar * p )
00163 {
00164 int i;
00165 if ( p == NULL ) return;
00166 for ( i = 0; i <= p->posTotal; i++ )
00167 fprintf( p->pFile, " " );
00168 fprintf( p->pFile, "\r" );
00169 fflush( stdout );
00170 }
00171
00175
00176