Home | History | Annotate | Download | only in utils
      1 #!/usr/bin/perl
      2 #
      3 # Perl script to convert a Syslinux-format screen to PC-ANSI
      4 # to display in a color xterm or on the Linux console
      5 #
      6 
      7 @ansicol = (0,4,2,6,1,5,3,7);
      8 
      9 $getting_file = 0;
     10 $enable = 1;
     11 
     12 while ( read(STDIN, $ch, 1) > 0 ) {
     13     if ( $ch eq "\x1A" ) {	# <SUB> <Ctrl-Z> EOF
     14 	last;
     15     } elsif ( $ch eq "\x0C" ) {	# <FF>  <Ctrl-L> Clear screen
     16 	print "\x1b[2J" if ( $enable && !$getting_file );
     17     } elsif ( $ch eq "\x0F" ) {	# <SI>  <Ctrl-O> Attribute change
     18 	if ( !$getting_file ) {
     19 	    if ( read(STDIN, $attr, 2) == 2 ) {
     20 		$attr = hex $attr;
     21 		if ( $enable ) {
     22 		    print "\x1b[0;";
     23 		    if ( $attr & 0x80 ) {
     24 			print "5;";
     25 			$attr &= ~0x80;
     26 		    }
     27 		    if ( $attr & 0x08 ) {
     28 			print "1;";
     29 			$attr &= ~0x08;
     30 		    }
     31 		    printf "%d;%dm",
     32 		    $ansicol[$attr >> 4] + 40, $ansicol[$attr & 7] + 30;
     33 		}
     34 	    }
     35 	}
     36     } elsif ( $ch eq "\x18" ) {	# <CAN> <Ctrl-X> Display image
     37 	# We can't display an image; pretend to be a text screen
     38 	# Ignore all input until end of line
     39 	$getting_file = 1;
     40     } elsif ( (ord($ch) & ~07) == 0x10 ) { # Mode controls
     41 	$enable = (ord($ch) & 0x01); # Emulate the text screen
     42     } elsif ( $ch eq "\x0D" ) {	# <CR>  <Ctrl-M> Carriage return
     43 	# Ignore
     44     } elsif ( $ch eq "\x0A" ) { # <LF>  <Ctrl-J> Line feed
     45 	if ( $getting_file ) {
     46 	    $getting_file = 0;
     47 	} else {
     48 	    print $ch if ( $enable );
     49 	}
     50     } else {
     51 	print $ch if ( $enable && !$getting_file );
     52     }
     53 }
     54