00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
#include "ShellProgressBar.h"
00040
#include <plearn/base/stringutils.h>
00041
#include <fstream>
00042
#include <plearn/sys/Popen.h>
00043
00044
namespace PLearn {
00045
using namespace std;
00046
00047 ShellProgressBar::ShellProgressBar(
int min,
int max,
string caption,
int width)
00048 :
min(
min),
max(
max), caption(caption), width(width)
00049 {
00050
init();
00051 }
00052
00053 void ShellProgressBar::init()
00054 {
00055
blockwidth = (
real)(
max -
min) /
width;
00056
pos = 0;
00057
max_reached =
false;
00058 }
00059
00060 void ShellProgressBar::draw(
bool simple_mode)
00061 {
00062
if (simple_mode)
00063 {
00064 cout <<
caption <<
" " <<
getTime() <<
" ";
00065 cout.flush();
00066 }
else
00067 {
00068 cout <<
caption <<
" " <<
getTime() <<
" |";
00069
for (
int i = 0;i <
width; i++) cout <<
" ";
00070 cout <<
"|";
00071
string move_cursor_left =
"\033[" +
tostring(width + 1) +
"D";
00072 cout << move_cursor_left;
00073 cout.flush();
00074 }
00075 }
00076
00077 bool ShellProgressBar::update(
int value)
00078 {
00079
if (value <
min ||
max_reached)
00080 {
00081
return false;
00082 }
else if (value >=
max)
00083 {
00084
for (
int i =
pos; i <
width; i++)
00085 {
00086 cout <<
"=";
00087 cout.flush();
00088 }
00089
max_reached =
true;
00090
return true;
00091 }
00092
00093
int inc = (
int)((value -
min) /
blockwidth);
00094
00095
int i;
00096
for (i =
pos; i < inc; i++)
00097 {
00098 cout <<
"=";
00099 cout.flush();
00100 }
00101 pos = i;
00102
00103
return true;
00104 }
00105
00106 void ShellProgressBar::reset()
00107 {
00108
max_reached =
false;
00109
pos = 0;
00110 }
00111
00112 void ShellProgressBar::setCaption(
string the_caption)
00113 {
00114
caption = the_caption;
00115 }
00116
00117 void ShellProgressBar::setMin(
int the_min)
00118 {
00119
min = the_min;
00120 }
00121
00122 void ShellProgressBar::setMax(
int the_max)
00123 {
00124
max = the_max;
00125 }
00126
00127 void ShellProgressBar::done()
00128 {
00129
if (!
max_reached)
00130
update(
max);
00131 cout <<
"\033[2C" <<
getTime() <<
endl;
00132 }
00133
00134 int ShellProgressBar::getAsciiFileLineCount(
string file)
00135 {
00136
00137
00138
00139 ifstream in(file.c_str());
00140
int n_lines = 0;
00141
while (in)
00142 {
00143
pgetline(in);
00144 n_lines++;
00145 }
00146 in.close();
00147
return n_lines;
00148 }
00149
00150 int ShellProgressBar::getWcAsciiFileLineCount(
string file)
00151 {
00152
string wc =
"wc -l " + file;
00153
vector<string> answer =
execute(wc);
00154
return toint(answer[0]);
00155 }
00156
00157 string ShellProgressBar::getTime()
00158 {
00159 time_t tt;
00160 time(&tt);
00161
string time_str(ctime(&tt));
00162
vector<string> tokens =
split(time_str);
00163
return "[" + tokens[3] +
"]";
00164 }
00165
00166 }
00167
00168