@@ -218,16 +218,13 @@ enum { ESnormal, ESesc, ESsquare, ESgetpars, ESgotpars, ESfunckey,
218218 ESpalette };
219219#define NPAR 16
220220static unsigned int state = ESnormal ;
221- static int npar , nl ;
222- static unsigned long int line ;
221+ static int npar , nl , cr ;
223222
224223/*
225224 * Workaround for spinner of fsck/e2fsck
226225 * Uses ascii lines ending with '\r' only
227226 */
228227static int spin ;
229- #define PROGLEN 192
230- static unsigned char prog [PROGLEN ];
231228
232229void parselog (const char * buf , const size_t s )
233230{
@@ -259,6 +256,8 @@ void parselog(const char *buf, const size_t s)
259256 }
260257 }
261258
259+ nl = 0 ;
260+
262261 switch (state ) {
263262 case ESnormal :
264263 default :
@@ -268,28 +267,26 @@ void parselog(const char *buf, const size_t s)
268267 case 16 ... 23 :
269268 case 25 :
270269 case 28 ... 31 :
271- nl = 0 ;
272270 follow = 0 ;
273271 addlog ('^' ); addlog (c + 64 );
274272 break ;
275273 case '\n' :
276- if (spin > 4 ) /* last spinner line */
277- storelog ((char * )prog , strlen ((char * )prog ));
278274 nl = 1 ;
279- line ++ ;
280- follow = spin = 0 ;
275+ follow = 0 ;
276+ cr = spin = 0 ;
281277 addlog (c );
282278 break ;
283279 case '\r' :
284280 follow = 0 ;
285- spin ++ ;
286- if (spin < 5 ) {
287- // if (spin > 1)
288- // addlog('\n');
289- nl = 1 ;
281+ if (cr ++ > 0 )
282+ {
283+ spin ++ ;
284+ #if 0
285+ storelog (">spin" , 5 );
286+ addlog (48 + spin );
287+ addlog ('<' );
288+ #endif
290289 }
291- if (spin == 5 )
292- storelog ("\n<progress bar skipped>\n" , 24 );
293290 break ;
294291 case 14 :
295292 case 15 :
@@ -305,82 +302,43 @@ void parselog(const char *buf, const size_t s)
305302 break ;
306303 case '\t' :
307304 case 32 ... 126 :
308- if (spin < 5 ) {
309- // if (spin == 1 && nl)
310- // addlog('\n');
311- addlog (c );
312- } else { /* Seems to be a lengthy spinner line */
313- static int old = 0 ;
314- static ssize_t p = 0 ;
315- if (old != spin ) {
316- old = spin ; /* Next line overwrite on tty */
317- p = 0 ;
318- bzero (prog , PROGLEN );
319- }
320- if (p < PROGLEN )
321- prog [p ++ ] = c ; /* buffer always current line */
322- }
323- nl = 0 ;
305+ addlog (c );
324306 follow = 0 ;
325307 break ;
326308 case 160 ... 255 :
327- if (spin < 5 ) {
328- // if (spin == 1 && nl)
329- // addlog('\n');
330- if ((c & 0xc0 ) == 0x80 ) {
331- if (follow ) {
332- addlog (c );
333- follow -- ;
334- break ;
335- }
336- } if (follow ) {
337- addlog (c );
338- break ;
339- }
340- if ((up = snprintf ((char * )uprt , sizeof (uprt ), "\\%03o" , c )) > 0 )
341- storelog ((char * )uprt , (size_t )up );
342- } else { /* Seems to be a lengthy spinner line */
343- static int old = 0 ;
344- static ssize_t p = 0 ;
345- if (old != spin ) {
346- old = spin ; /* Next line overwrite on tty */
347- p = 0 ;
348- bzero (prog , PROGLEN );
349- }
350- if (p < PROGLEN )
351- prog [p ++ ] = c ; /* buffer always current line */
309+ if (follow ) {
310+ if ((c & 0xc0 ) == 0x80 )
311+ follow -- ;
312+ addlog (c );
313+ break ;
352314 }
353- nl = 0 ;
315+ if ((up = snprintf ((char * )uprt , sizeof (uprt ), "\\%03o" , c )) > 0 )
316+ storelog ((char * )uprt , (size_t )up );
354317 break ;
355318 case 127 :
356- nl = 0 ;
357319 follow = 0 ;
358320 addlog ('^' ); addlog ('?' );
359321 break ;
360322 case 128 ... 159 :
361- nl = 0 ;
362- if ((c & 0xc0 ) == 0x80 ) {
363- if (follow ) {
364- addlog (c );
323+ if (follow ) {
324+ if ((c & 0xc0 ) == 0x80 )
365325 follow -- ;
366- break ;
367- }
368- } if (follow ) {
369326 addlog (c );
370327 break ;
371328 }
372329 if ((up = snprintf ((char * )uprt , sizeof (uprt ), "\\%03o" , c )) > 0 )
373330 storelog ((char * )uprt , (size_t )up );
374331 break ;
375332 default :
376- nl = 0 ;
377- follow = spin = 0 ;
333+ cr = 0 ;
334+ follow = 0 ;
378335 if ((up = snprintf ((char * )uprt , sizeof (uprt ), "0x%X" , c )) > 0 )
379336 storelog ((char * )uprt , (size_t )up );
380337 break ;
381338 }
382339 break ;
383340 case ESesc :
341+ follow = 0 ;
384342 state = ESnormal ;
385343 switch ((unsigned char )c ) {
386344 case '[' :
@@ -394,12 +352,8 @@ void parselog(const char *buf, const size_t s)
394352 break ;
395353 case 'E' :
396354 case 'D' :
397- if (spin > 4 ) /* last spinner line */
398- storelog ((char * )prog , strlen ((char * )prog ));
355+ addlog ('\n' );
399356 nl = 1 ;
400- line ++ ;
401- spin = 0 ;
402- // addlog('\n');
403357 break ;
404358 case '(' :
405359 state = ESsetG0 ;
@@ -420,6 +374,7 @@ void parselog(const char *buf, const size_t s)
420374 }
421375 break ;
422376 case ESnonstd :
377+ follow = 0 ;
423378 if (c == 'P' ) {
424379 npar = 0 ;
425380 state = ESpalette ;
@@ -429,6 +384,7 @@ void parselog(const char *buf, const size_t s)
429384 state = ESnormal ;
430385 break ;
431386 case ESpalette :
387+ follow = 0 ;
432388 if ((c >='0' && c <='9' ) || (c >='A' && c <='F' ) || (c >='a' && c <='f' )) {
433389 npar ++ ;
434390 if (npar == 7 )
@@ -437,15 +393,21 @@ void parselog(const char *buf, const size_t s)
437393 state = ESnormal ;
438394 break ;
439395 case ESsquare :
396+ follow = 0 ;
440397 npar = 0 ;
441398 state = ESgetpars ;
442399 if (c == '[' ) {
443400 state = ESfunckey ;
444401 break ;
445402 }
403+ #if 0
404+ if (c == 'K' )
405+ storelog (" el " , 4 );
406+ #endif
446407 if (c == '?' )
447408 break ;
448409 case ESgetpars :
410+ follow = 0 ;
449411 if (c == ';' && npar < NPAR - 1 ) {
450412 npar ++ ;
451413 break ;
@@ -454,19 +416,23 @@ void parselog(const char *buf, const size_t s)
454416 } else
455417 state = ESgotpars ;
456418 case ESgotpars :
419+ follow = 0 ;
457420 state = ESnormal ;
458421 break ;
459422 case ESpercent :
423+ follow = 0 ;
460424 state = ESnormal ;
461425 break ;
462426 case ESfunckey :
463427 case EShash :
464428 case ESsetG0 :
465429 case ESsetG1 :
430+ follow = 0 ;
466431 state = ESnormal ;
467432 break ;
468433#ifdef BLOGD_EXT
469434 case ESignore : /* Boot log extension */
435+ follow = 0 ;
470436 state = ESesc ;
471437 {
472438 unsigned char echo [64 ];
0 commit comments