diff options
Diffstat (limited to '')
-rw-r--r-- | src/stable/minicron.cpp | 622 |
1 files changed, 311 insertions, 311 deletions
diff --git a/src/stable/minicron.cpp b/src/stable/minicron.cpp index 87296ae..c83cd44 100644 --- a/src/stable/minicron.cpp +++ b/src/stable/minicron.cpp | |||
@@ -11,260 +11,260 @@ | |||
11 | #include <time.h> | 11 | #include <time.h> |
12 | 12 | ||
13 | Bu::MiniCron::MiniCron() : | 13 | Bu::MiniCron::MiniCron() : |
14 | jidNext( 1 ) | 14 | jidNext( 1 ) |
15 | { | 15 | { |
16 | } | 16 | } |
17 | 17 | ||
18 | Bu::MiniCron::~MiniCron() | 18 | Bu::MiniCron::~MiniCron() |
19 | { | 19 | { |
20 | while( !hJobs.isEmpty() ) | 20 | while( !hJobs.isEmpty() ) |
21 | { | 21 | { |
22 | delete hJobs.dequeue(); | 22 | delete hJobs.dequeue(); |
23 | } | 23 | } |
24 | } | 24 | } |
25 | 25 | ||
26 | bool Bu::MiniCron::hasJobs() | 26 | bool Bu::MiniCron::hasJobs() |
27 | { | 27 | { |
28 | return !hJobs.isEmpty(); | 28 | return !hJobs.isEmpty(); |
29 | } | 29 | } |
30 | 30 | ||
31 | time_t Bu::MiniCron::getNextRun() | 31 | time_t Bu::MiniCron::getNextRun() |
32 | { | 32 | { |
33 | if( hasJobs() ) | 33 | if( hasJobs() ) |
34 | return hJobs.peek()->getNextRun(); | 34 | return hJobs.peek()->getNextRun(); |
35 | return -1; | 35 | return -1; |
36 | } | 36 | } |
37 | 37 | ||
38 | time_t Bu::MiniCron::getNextRun( Bu::MiniCron::JobId jid ) | 38 | time_t Bu::MiniCron::getNextRun( Bu::MiniCron::JobId jid ) |
39 | { | 39 | { |
40 | for( JobHeap::iterator i = hJobs.begin(); i; i++ ) | 40 | for( JobHeap::iterator i = hJobs.begin(); i; i++ ) |
41 | { | 41 | { |
42 | if( (*i)->getId() == jid ) | 42 | if( (*i)->getId() == jid ) |
43 | { | 43 | { |
44 | return (*i)->getNextRunTime(); | 44 | return (*i)->getNextRunTime(); |
45 | } | 45 | } |
46 | } | 46 | } |
47 | return -1; | 47 | return -1; |
48 | } | 48 | } |
49 | 49 | ||
50 | void Bu::MiniCron::poll() | 50 | void Bu::MiniCron::poll() |
51 | { | 51 | { |
52 | time_t tNow = time( NULL ); | 52 | time_t tNow = time( NULL ); |
53 | 53 | ||
54 | while( !hJobs.isEmpty() ) | 54 | while( !hJobs.isEmpty() ) |
55 | { | 55 | { |
56 | if( hJobs.peek()->getNextRun() <= tNow ) | 56 | if( hJobs.peek()->getNextRun() <= tNow ) |
57 | { | 57 | { |
58 | Job *pJob = hJobs.dequeue(); | 58 | Job *pJob = hJobs.dequeue(); |
59 | pJob->run(); | 59 | pJob->run(); |
60 | if( pJob->bContinue ) | 60 | if( pJob->bContinue ) |
61 | { | 61 | { |
62 | hJobs.enqueue( pJob ); | 62 | hJobs.enqueue( pJob ); |
63 | } | 63 | } |
64 | else | 64 | else |
65 | { | 65 | { |
66 | delete pJob; | 66 | delete pJob; |
67 | } | 67 | } |
68 | } | 68 | } |
69 | else | 69 | else |
70 | { | 70 | { |
71 | break; | 71 | break; |
72 | } | 72 | } |
73 | } | 73 | } |
74 | } | 74 | } |
75 | 75 | ||
76 | Bu::MiniCron::JobId Bu::MiniCron::addJob( const Bu::String &sName, | 76 | Bu::MiniCron::JobId Bu::MiniCron::addJob( const Bu::String &sName, |
77 | Bu::MiniCron::CronSignal sigJob, const Bu::MiniCron::Timer &t ) | 77 | Bu::MiniCron::CronSignal sigJob, const Bu::MiniCron::Timer &t ) |
78 | { | 78 | { |
79 | JobId jid = jidNext++; | 79 | JobId jid = jidNext++; |
80 | Job *pJob = new Job( sName, jid ); | 80 | Job *pJob = new Job( sName, jid ); |
81 | pJob->sigJob = sigJob; | 81 | pJob->sigJob = sigJob; |
82 | pJob->pTimer = t.clone(); | 82 | pJob->pTimer = t.clone(); |
83 | pJob->tNextRun = pJob->pTimer->nextTime(); | 83 | pJob->tNextRun = pJob->pTimer->nextTime(); |
84 | hJobs.enqueue( pJob ); | 84 | hJobs.enqueue( pJob ); |
85 | 85 | ||
86 | return jid; | 86 | return jid; |
87 | } | 87 | } |
88 | 88 | ||
89 | Bu::MiniCron::JobId Bu::MiniCron::addJobOnce( const Bu::String &sName, | 89 | Bu::MiniCron::JobId Bu::MiniCron::addJobOnce( const Bu::String &sName, |
90 | Bu::MiniCron::CronSignal sigJob, const Bu::MiniCron::Timer &t ) | 90 | Bu::MiniCron::CronSignal sigJob, const Bu::MiniCron::Timer &t ) |
91 | { | 91 | { |
92 | JobId jid = jidNext++; | 92 | JobId jid = jidNext++; |
93 | Job *pJob = new Job( sName, jid, false ); | 93 | Job *pJob = new Job( sName, jid, false ); |
94 | pJob->sigJob = sigJob; | 94 | pJob->sigJob = sigJob; |
95 | pJob->pTimer = t.clone(); | 95 | pJob->pTimer = t.clone(); |
96 | pJob->tNextRun = pJob->pTimer->nextTime(); | 96 | pJob->tNextRun = pJob->pTimer->nextTime(); |
97 | hJobs.enqueue( pJob ); | 97 | hJobs.enqueue( pJob ); |
98 | 98 | ||
99 | return jid; | 99 | return jid; |
100 | } | 100 | } |
101 | 101 | ||
102 | void Bu::MiniCron::removeJob( JobId jid ) | 102 | void Bu::MiniCron::removeJob( JobId jid ) |
103 | { | 103 | { |
104 | Bu::List<Job *> lJobs; | 104 | Bu::List<Job *> lJobs; |
105 | while( !hJobs.isEmpty() ) | 105 | while( !hJobs.isEmpty() ) |
106 | { | 106 | { |
107 | Job *pJob = hJobs.dequeue(); | 107 | Job *pJob = hJobs.dequeue(); |
108 | if( pJob->getId() == jid ) | 108 | if( pJob->getId() == jid ) |
109 | { | 109 | { |
110 | delete pJob; | 110 | delete pJob; |
111 | } | 111 | } |
112 | else | 112 | else |
113 | lJobs.append( pJob ); | 113 | lJobs.append( pJob ); |
114 | } | 114 | } |
115 | 115 | ||
116 | for( Bu::List<Job *>::iterator i = lJobs.begin(); i; i++ ) | 116 | for( Bu::List<Job *>::iterator i = lJobs.begin(); i; i++ ) |
117 | { | 117 | { |
118 | hJobs.enqueue( *i ); | 118 | hJobs.enqueue( *i ); |
119 | } | 119 | } |
120 | } | 120 | } |
121 | 121 | ||
122 | void Bu::MiniCron::runJob( JobId jid, bool bReschedule ) | 122 | void Bu::MiniCron::runJob( JobId jid, bool bReschedule ) |
123 | { | 123 | { |
124 | Bu::List<Job *> lJobs; | 124 | Bu::List<Job *> lJobs; |
125 | while( !hJobs.isEmpty() ) | 125 | while( !hJobs.isEmpty() ) |
126 | { | 126 | { |
127 | Job *pJob = hJobs.dequeue(); | 127 | Job *pJob = hJobs.dequeue(); |
128 | if( pJob->getId() == jid ) | 128 | if( pJob->getId() == jid ) |
129 | { | 129 | { |
130 | pJob->run( bReschedule ); | 130 | pJob->run( bReschedule ); |
131 | if( !pJob->bContinue ) | 131 | if( !pJob->bContinue ) |
132 | { | 132 | { |
133 | delete pJob; | 133 | delete pJob; |
134 | break; | 134 | break; |
135 | } | 135 | } |
136 | lJobs.append( pJob ); | 136 | lJobs.append( pJob ); |
137 | break; | 137 | break; |
138 | } | 138 | } |
139 | lJobs.append( pJob ); | 139 | lJobs.append( pJob ); |
140 | } | 140 | } |
141 | 141 | ||
142 | for( Bu::List<Job *>::iterator i = lJobs.begin(); i; i++ ) | 142 | for( Bu::List<Job *>::iterator i = lJobs.begin(); i; i++ ) |
143 | { | 143 | { |
144 | hJobs.enqueue( *i ); | 144 | hJobs.enqueue( *i ); |
145 | } | 145 | } |
146 | } | 146 | } |
147 | 147 | ||
148 | void Bu::MiniCron::runJob( const Bu::String &sName, bool bReschedule ) | 148 | void Bu::MiniCron::runJob( const Bu::String &sName, bool bReschedule ) |
149 | { | 149 | { |
150 | Bu::List<Job *> lJobs; | 150 | Bu::List<Job *> lJobs; |
151 | while( !hJobs.isEmpty() ) | 151 | while( !hJobs.isEmpty() ) |
152 | { | 152 | { |
153 | Job *pJob = hJobs.dequeue(); | 153 | Job *pJob = hJobs.dequeue(); |
154 | if( pJob->getName() == sName ) | 154 | if( pJob->getName() == sName ) |
155 | { | 155 | { |
156 | pJob->run( bReschedule ); | 156 | pJob->run( bReschedule ); |
157 | if( !pJob->bContinue ) | 157 | if( !pJob->bContinue ) |
158 | { | 158 | { |
159 | delete pJob; | 159 | delete pJob; |
160 | break; | 160 | break; |
161 | } | 161 | } |
162 | lJobs.append( pJob ); | 162 | lJobs.append( pJob ); |
163 | break; | 163 | break; |
164 | } | 164 | } |
165 | lJobs.append( pJob ); | 165 | lJobs.append( pJob ); |
166 | } | 166 | } |
167 | 167 | ||
168 | for( Bu::List<Job *>::iterator i = lJobs.begin(); i; i++ ) | 168 | for( Bu::List<Job *>::iterator i = lJobs.begin(); i; i++ ) |
169 | { | 169 | { |
170 | hJobs.enqueue( *i ); | 170 | hJobs.enqueue( *i ); |
171 | } | 171 | } |
172 | } | 172 | } |
173 | 173 | ||
174 | Bu::MiniCron::JobInfoList Bu::MiniCron::getJobInfo() | 174 | Bu::MiniCron::JobInfoList Bu::MiniCron::getJobInfo() |
175 | { | 175 | { |
176 | JobInfoList lRet; | 176 | JobInfoList lRet; |
177 | for( JobHeap::iterator i = hJobs.begin(); i; i++ ) | 177 | for( JobHeap::iterator i = hJobs.begin(); i; i++ ) |
178 | { | 178 | { |
179 | lRet.append( | 179 | lRet.append( |
180 | JobInfo( (*i)->getName(), (*i)->getId(), (*i)->getNextRun() ) | 180 | JobInfo( (*i)->getName(), (*i)->getId(), (*i)->getNextRun() ) |
181 | ); | 181 | ); |
182 | } | 182 | } |
183 | lRet.sort(); | 183 | lRet.sort(); |
184 | return lRet; | 184 | return lRet; |
185 | } | 185 | } |
186 | 186 | ||
187 | Bu::MiniCron::Job::Job( const Bu::String &sName, JobId jid, bool bRepeat ) : | 187 | Bu::MiniCron::Job::Job( const Bu::String &sName, JobId jid, bool bRepeat ) : |
188 | sName( sName ), | 188 | sName( sName ), |
189 | pTimer( NULL ), | 189 | pTimer( NULL ), |
190 | bContinue( bRepeat ), | 190 | bContinue( bRepeat ), |
191 | jid( jid ), | 191 | jid( jid ), |
192 | tAdded( time( NULL ) ), | 192 | tAdded( time( NULL ) ), |
193 | iRunCount( 0 ) | 193 | iRunCount( 0 ) |
194 | { | 194 | { |
195 | } | 195 | } |
196 | 196 | ||
197 | Bu::MiniCron::Job::~Job() | 197 | Bu::MiniCron::Job::~Job() |
198 | { | 198 | { |
199 | delete pTimer; | 199 | delete pTimer; |
200 | pTimer = NULL; | 200 | pTimer = NULL; |
201 | } | 201 | } |
202 | 202 | ||
203 | void Bu::MiniCron::Job::run( bool bReschedule ) | 203 | void Bu::MiniCron::Job::run( bool bReschedule ) |
204 | { | 204 | { |
205 | iRunCount++; | 205 | iRunCount++; |
206 | if( bReschedule ) | 206 | if( bReschedule ) |
207 | tNextRun = pTimer->nextTime(); | 207 | tNextRun = pTimer->nextTime(); |
208 | sigJob( *this ); | 208 | sigJob( *this ); |
209 | } | 209 | } |
210 | 210 | ||
211 | time_t Bu::MiniCron::Job::getNextRun() const | 211 | time_t Bu::MiniCron::Job::getNextRun() const |
212 | { | 212 | { |
213 | return tNextRun; | 213 | return tNextRun; |
214 | } | 214 | } |
215 | 215 | ||
216 | void Bu::MiniCron::Job::calcNextRun() | 216 | void Bu::MiniCron::Job::calcNextRun() |
217 | { | 217 | { |
218 | if( pTimer ) | 218 | if( pTimer ) |
219 | tNextRun = pTimer->nextTime(); | 219 | tNextRun = pTimer->nextTime(); |
220 | } | 220 | } |
221 | 221 | ||
222 | void Bu::MiniCron::Job::setTimer( const Timer &t ) | 222 | void Bu::MiniCron::Job::setTimer( const Timer &t ) |
223 | { | 223 | { |
224 | delete pTimer; | 224 | delete pTimer; |
225 | pTimer = t.clone(); | 225 | pTimer = t.clone(); |
226 | } | 226 | } |
227 | 227 | ||
228 | void Bu::MiniCron::Job::stop() | 228 | void Bu::MiniCron::Job::stop() |
229 | { | 229 | { |
230 | bContinue = false; | 230 | bContinue = false; |
231 | } | 231 | } |
232 | 232 | ||
233 | void Bu::MiniCron::Job::resume() | 233 | void Bu::MiniCron::Job::resume() |
234 | { | 234 | { |
235 | bContinue = true; | 235 | bContinue = true; |
236 | } | 236 | } |
237 | 237 | ||
238 | Bu::MiniCron::JobId Bu::MiniCron::Job::getId() const | 238 | Bu::MiniCron::JobId Bu::MiniCron::Job::getId() const |
239 | { | 239 | { |
240 | return jid; | 240 | return jid; |
241 | } | 241 | } |
242 | 242 | ||
243 | time_t Bu::MiniCron::Job::getTimeCreated() const | 243 | time_t Bu::MiniCron::Job::getTimeCreated() const |
244 | { | 244 | { |
245 | return tAdded; | 245 | return tAdded; |
246 | } | 246 | } |
247 | 247 | ||
248 | int Bu::MiniCron::Job::getRunCount() const | 248 | int Bu::MiniCron::Job::getRunCount() const |
249 | { | 249 | { |
250 | return iRunCount; | 250 | return iRunCount; |
251 | } | 251 | } |
252 | 252 | ||
253 | time_t Bu::MiniCron::Job::getNextRunTime() const | 253 | time_t Bu::MiniCron::Job::getNextRunTime() const |
254 | { | 254 | { |
255 | return tNextRun; | 255 | return tNextRun; |
256 | } | 256 | } |
257 | 257 | ||
258 | Bu::String Bu::MiniCron::Job::getName() const | 258 | Bu::String Bu::MiniCron::Job::getName() const |
259 | { | 259 | { |
260 | return sName; | 260 | return sName; |
261 | } | 261 | } |
262 | 262 | ||
263 | Bu::MiniCron::JobInfo::JobInfo( const Bu::String &sName, JobId jid, | 263 | Bu::MiniCron::JobInfo::JobInfo( const Bu::String &sName, JobId jid, |
264 | time_t tNext ) : | 264 | time_t tNext ) : |
265 | sName( sName ), | 265 | sName( sName ), |
266 | jid( jid ), | 266 | jid( jid ), |
267 | tNext( tNext ) | 267 | tNext( tNext ) |
268 | { | 268 | { |
269 | } | 269 | } |
270 | 270 | ||
@@ -274,7 +274,7 @@ Bu::MiniCron::JobInfo::~JobInfo() | |||
274 | 274 | ||
275 | bool Bu::MiniCron::JobInfo::operator<( const JobInfo &rhs ) const | 275 | bool Bu::MiniCron::JobInfo::operator<( const JobInfo &rhs ) const |
276 | { | 276 | { |
277 | return jid < rhs.jid; | 277 | return jid < rhs.jid; |
278 | } | 278 | } |
279 | 279 | ||
280 | Bu::MiniCron::Timer::Timer() | 280 | Bu::MiniCron::Timer::Timer() |
@@ -286,8 +286,8 @@ Bu::MiniCron::Timer::~Timer() | |||
286 | } | 286 | } |
287 | 287 | ||
288 | Bu::MiniCron::TimerInterval::TimerInterval( time_t tFirst, time_t tInterval ) : | 288 | Bu::MiniCron::TimerInterval::TimerInterval( time_t tFirst, time_t tInterval ) : |
289 | tNext( tFirst ), | 289 | tNext( tFirst ), |
290 | tInterval( tInterval ) | 290 | tInterval( tInterval ) |
291 | { | 291 | { |
292 | } | 292 | } |
293 | 293 | ||
@@ -297,14 +297,14 @@ Bu::MiniCron::TimerInterval::~TimerInterval() | |||
297 | 297 | ||
298 | time_t Bu::MiniCron::TimerInterval::nextTime() | 298 | time_t Bu::MiniCron::TimerInterval::nextTime() |
299 | { | 299 | { |
300 | time_t tRet = tNext; | 300 | time_t tRet = tNext; |
301 | tNext += tInterval; | 301 | tNext += tInterval; |
302 | return tRet; | 302 | return tRet; |
303 | } | 303 | } |
304 | 304 | ||
305 | Bu::MiniCron::TimerBasic::TimerBasic( const Bu::String &s ) : | 305 | Bu::MiniCron::TimerBasic::TimerBasic( const Bu::String &s ) : |
306 | tLast( -1 ), | 306 | tLast( -1 ), |
307 | sSpec( s ) | 307 | sSpec( s ) |
308 | { | 308 | { |
309 | } | 309 | } |
310 | 310 | ||
@@ -314,164 +314,164 @@ Bu::MiniCron::TimerBasic::~TimerBasic() | |||
314 | 314 | ||
315 | time_t Bu::MiniCron::TimerBasic::nextTime() | 315 | time_t Bu::MiniCron::TimerBasic::nextTime() |
316 | { | 316 | { |
317 | if( tLast == -1 ) | 317 | if( tLast == -1 ) |
318 | tLast = time( NULL ); | 318 | tLast = time( NULL ); |
319 | 319 | ||
320 | Bu::String::const_iterator i = sSpec.begin(); | 320 | Bu::String::const_iterator i = sSpec.begin(); |
321 | switch( lex( i ) ) | 321 | switch( lex( i ) ) |
322 | { | 322 | { |
323 | case tokDaily: | 323 | case tokDaily: |
324 | { | 324 | { |
325 | int iHour = lexInt( i ); | 325 | int iHour = lexInt( i ); |
326 | int iMin = lexInt( i ); | 326 | int iMin = lexInt( i ); |
327 | 327 | ||
328 | struct tm t; | 328 | struct tm t; |
329 | ::memcpy( &t, localtime( &tLast ), sizeof(struct tm) ); | 329 | ::memcpy( &t, localtime( &tLast ), sizeof(struct tm) ); |
330 | if( iHour < t.tm_hour || | 330 | if( iHour < t.tm_hour || |
331 | (iHour == t.tm_hour && iMin <= t.tm_min) ) | 331 | (iHour == t.tm_hour && iMin <= t.tm_min) ) |
332 | { | 332 | { |
333 | t.tm_mday++; | 333 | t.tm_mday++; |
334 | } | 334 | } |
335 | t.tm_hour = iHour; | 335 | t.tm_hour = iHour; |
336 | t.tm_min = iMin; | 336 | t.tm_min = iMin; |
337 | t.tm_sec = 0; | 337 | t.tm_sec = 0; |
338 | tLast = mktime( &t ); | 338 | tLast = mktime( &t ); |
339 | } | 339 | } |
340 | break; | 340 | break; |
341 | 341 | ||
342 | case tokHourly: | 342 | case tokHourly: |
343 | { | 343 | { |
344 | int iMin = lexInt( i ); | 344 | int iMin = lexInt( i ); |
345 | 345 | ||
346 | struct tm t; | 346 | struct tm t; |
347 | ::memcpy( &t, localtime( &tLast ), sizeof(struct tm) ); | 347 | ::memcpy( &t, localtime( &tLast ), sizeof(struct tm) ); |
348 | if( iMin <= t.tm_min ) | 348 | if( iMin <= t.tm_min ) |
349 | t.tm_hour++; | 349 | t.tm_hour++; |
350 | t.tm_min = iMin; | 350 | t.tm_min = iMin; |
351 | t.tm_sec = 0; | 351 | t.tm_sec = 0; |
352 | tLast = mktime( &t ); | 352 | tLast = mktime( &t ); |
353 | } | 353 | } |
354 | break; | 354 | break; |
355 | 355 | ||
356 | case tokWeekly: | 356 | case tokWeekly: |
357 | { | 357 | { |
358 | int iDay = lexInt( i ); | 358 | int iDay = lexInt( i ); |
359 | int iHour = lexInt( i ); | 359 | int iHour = lexInt( i ); |
360 | int iMin = lexInt( i ); | 360 | int iMin = lexInt( i ); |
361 | 361 | ||
362 | struct tm t; | 362 | struct tm t; |
363 | ::memcpy( &t, localtime( &tLast ), sizeof(struct tm) ); | 363 | ::memcpy( &t, localtime( &tLast ), sizeof(struct tm) ); |
364 | if( iDay < t.tm_wday || | 364 | if( iDay < t.tm_wday || |
365 | (iDay == t.tm_wday && iHour < t.tm_hour) || | 365 | (iDay == t.tm_wday && iHour < t.tm_hour) || |
366 | (iDay == t.tm_wday && iHour == t.tm_hour | 366 | (iDay == t.tm_wday && iHour == t.tm_hour |
367 | && iMin <= t.tm_min) ) | 367 | && iMin <= t.tm_min) ) |
368 | { | 368 | { |
369 | if( iDay <= t.tm_wday ) | 369 | if( iDay <= t.tm_wday ) |
370 | t.tm_mday += 7 - (t.tm_wday-iDay); | 370 | t.tm_mday += 7 - (t.tm_wday-iDay); |
371 | else | 371 | else |
372 | t.tm_mday += 7 - (iDay-t.tm_wday); | 372 | t.tm_mday += 7 - (iDay-t.tm_wday); |
373 | } | 373 | } |
374 | else | 374 | else |
375 | { | 375 | { |
376 | t.tm_mday += (iDay-t.tm_wday); | 376 | t.tm_mday += (iDay-t.tm_wday); |
377 | } | 377 | } |
378 | t.tm_hour = iHour; | 378 | t.tm_hour = iHour; |
379 | t.tm_min = iMin; | 379 | t.tm_min = iMin; |
380 | t.tm_sec = 0; | 380 | t.tm_sec = 0; |
381 | tLast = mktime( &t ); | 381 | tLast = mktime( &t ); |
382 | } | 382 | } |
383 | break; | 383 | break; |
384 | 384 | ||
385 | case tokMonthly: | 385 | case tokMonthly: |
386 | break; | 386 | break; |
387 | 387 | ||
388 | case tokYearly: | 388 | case tokYearly: |
389 | break; | 389 | break; |
390 | 390 | ||
391 | default: | 391 | default: |
392 | break; | 392 | break; |
393 | } | 393 | } |
394 | 394 | ||
395 | return tLast; | 395 | return tLast; |
396 | } | 396 | } |
397 | 397 | ||
398 | Bu::MiniCron::TimerBasic::Token Bu::MiniCron::TimerBasic::lex( | 398 | Bu::MiniCron::TimerBasic::Token Bu::MiniCron::TimerBasic::lex( |
399 | Bu::String::const_iterator &i ) | 399 | Bu::String::const_iterator &i ) |
400 | { | 400 | { |
401 | if( !i ) | 401 | if( !i ) |
402 | { | 402 | { |
403 | return tokEos; | 403 | return tokEos; |
404 | } | 404 | } |
405 | 405 | ||
406 | Bu::String::const_iterator b = i; | 406 | Bu::String::const_iterator b = i; |
407 | 407 | ||
408 | for(; b && (*b == ' ' || *b == '\t'); b++ ) { i = b+1; } | 408 | for(; b && (*b == ' ' || *b == '\t'); b++ ) { i = b+1; } |
409 | for(; b && *b != ' ' && *b != '\t'; b++ ) { } | 409 | for(; b && *b != ' ' && *b != '\t'; b++ ) { } |
410 | 410 | ||
411 | Bu::String sTok( i, b ); | 411 | Bu::String sTok( i, b ); |
412 | i = b; | 412 | i = b; |
413 | 413 | ||
414 | if( sTok == "daily" ) | 414 | if( sTok == "daily" ) |
415 | return tokDaily; | 415 | return tokDaily; |
416 | else if( sTok == "hourly" ) | 416 | else if( sTok == "hourly" ) |
417 | return tokHourly; | 417 | return tokHourly; |
418 | else if( sTok == "weekly" ) | 418 | else if( sTok == "weekly" ) |
419 | return tokWeekly; | 419 | return tokWeekly; |
420 | else if( sTok == "monthly" ) | 420 | else if( sTok == "monthly" ) |
421 | return tokMonthly; | 421 | return tokMonthly; |
422 | else if( sTok == "yearly" ) | 422 | else if( sTok == "yearly" ) |
423 | return tokYearly; | 423 | return tokYearly; |
424 | else if( sTok == "sun" ) | 424 | else if( sTok == "sun" ) |
425 | { | 425 | { |
426 | iVal = 0; | 426 | iVal = 0; |
427 | return valInt; | 427 | return valInt; |
428 | } | 428 | } |
429 | else if( sTok == "mon" ) | 429 | else if( sTok == "mon" ) |
430 | { | 430 | { |
431 | iVal = 1; | 431 | iVal = 1; |
432 | return valInt; | 432 | return valInt; |
433 | } | 433 | } |
434 | else if( sTok == "tue" ) | 434 | else if( sTok == "tue" ) |
435 | { | 435 | { |
436 | iVal = 2; | 436 | iVal = 2; |
437 | return valInt; | 437 | return valInt; |
438 | } | 438 | } |
439 | else if( sTok == "wed" ) | 439 | else if( sTok == "wed" ) |
440 | { | 440 | { |
441 | iVal = 3; | 441 | iVal = 3; |
442 | return valInt; | 442 | return valInt; |
443 | } | 443 | } |
444 | else if( sTok == "thu" ) | 444 | else if( sTok == "thu" ) |
445 | { | 445 | { |
446 | iVal = 4; | 446 | iVal = 4; |
447 | return valInt; | 447 | return valInt; |
448 | } | 448 | } |
449 | else if( sTok == "fri" ) | 449 | else if( sTok == "fri" ) |
450 | { | 450 | { |
451 | iVal = 5; | 451 | iVal = 5; |
452 | return valInt; | 452 | return valInt; |
453 | } | 453 | } |
454 | else if( sTok == "sat" ) | 454 | else if( sTok == "sat" ) |
455 | { | 455 | { |
456 | iVal = 6; | 456 | iVal = 6; |
457 | return valInt; | 457 | return valInt; |
458 | } | 458 | } |
459 | else if( sTok[0] >= '0' && sTok[0] <= '9' ) | 459 | else if( sTok[0] >= '0' && sTok[0] <= '9' ) |
460 | { | 460 | { |
461 | iVal = strtol( sTok.getStr(), NULL, 0 ); | 461 | iVal = strtol( sTok.getStr(), NULL, 0 ); |
462 | return valInt; | 462 | return valInt; |
463 | } | 463 | } |
464 | 464 | ||
465 | return tokErr; | 465 | return tokErr; |
466 | } | 466 | } |
467 | 467 | ||
468 | int Bu::MiniCron::TimerBasic::lexInt( Bu::String::const_iterator &i ) | 468 | int Bu::MiniCron::TimerBasic::lexInt( Bu::String::const_iterator &i ) |
469 | { | 469 | { |
470 | Token t = lex( i ); | 470 | Token t = lex( i ); |
471 | if( t == tokEos ) | 471 | if( t == tokEos ) |
472 | return 0; | 472 | return 0; |
473 | if( t != valInt ) | 473 | if( t != valInt ) |
474 | throw Bu::ExceptionBase("Expected int, got something else."); | 474 | throw Bu::ExceptionBase("Expected int, got something else."); |
475 | return iVal; | 475 | return iVal; |
476 | } | 476 | } |
477 | 477 | ||