/* * Copyright 1995, 2011 Perforce Software. All rights reserved. * * This file is part of Perforce - the FAST SCM System. */ # include # include # include # include ClientProgressText::ClientProgressText( int ty ) : typeOfProgress( ty ), total( 0 ), cnt( 0 ), backup( 0 ) { } ClientProgressText::~ClientProgressText() { } void ClientProgressText::Description( const StrPtr *description, int units ) { desc.Set( description ); printf( "%s ", desc.Text() ); cnt = 0; backup = 0; total = 0; } void ClientProgressText::Total( long t ) { total = t; } int ClientProgressText::Update( long pos ) { StrBuf res; if( cnt == 40 ) { // every 40 updates, rewrite description printf( "\r%s ", desc.Text() ); backup = 0; cnt = 0; } if( total ) { int pct = int(100.0 * pos / total); res << pct; res.Extend( '%' ); } else res << pos; res.Extend( ' ' ); res.Extend( "|/-\\"[ cnt++ & 3 ] ); res.Terminate(); while( backup-- > 0 ) putchar( '\b' ); fputs( res.Text(), stdout ); backup = res.Length(); fflush(stdout); return 0; } void ClientProgressText::Done( int fail ) { if( backup ) putchar( '\b' ); printf( fail == CPP_FAILDONE ? "failed!\n" : "finishing\n"); }