Completely nail inverse video
This commit is contained in:
		
							parent
							
								
									e1e296f8ee
								
							
						
					
					
						commit
						bd5268cd62
					
				
					 1 changed files with 34 additions and 12 deletions
				
			
		
							
								
								
									
										38
									
								
								main.c
									
										
									
									
									
								
							
							
						
						
									
										38
									
								
								main.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -12,7 +12,7 @@
 | 
			
		|||
#define ZXDUMP_STRIDE_GROUP 2
 | 
			
		||||
#define ZXDUMP_CHARSET_LEN 64
 | 
			
		||||
 | 
			
		||||
static uint16_t charset[ZXDUMP_CHARSET_LEN] = {
 | 
			
		||||
static uint32_t zx_charset[ZXDUMP_CHARSET_LEN] = {
 | 
			
		||||
    0x0020, 0x2598, 0x259d, 0x2580, 0x2596, 0x258c, 0x259e, 0x259b,
 | 
			
		||||
    0x2592, '.',    '.',    '"',    0x00a3, '$',    ':',    '?',
 | 
			
		||||
    '(',    ')',    '>',    '<',    '=',    '+',    '-',    '*',
 | 
			
		||||
| 
						 | 
				
			
			@ -63,7 +63,21 @@ static inline size_t utf8_encode(uint8_t *buf, uint32_t codepoint) {
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ssize_t dump_line(off_t offset, void *buf, size_t len) {
 | 
			
		||||
static inline int zx_putchar(uint8_t c) {
 | 
			
		||||
    uint8_t sequence[4];
 | 
			
		||||
    size_t len = utf8_encode(sequence, zx_charset[c]);
 | 
			
		||||
 | 
			
		||||
    if (fwrite(sequence, len, 1, stdout) < 1) {
 | 
			
		||||
        goto error_io;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
 | 
			
		||||
error_io:
 | 
			
		||||
    return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ssize_t dump_line(off_t offset, void *buf, size_t len, int tty) {
 | 
			
		||||
    size_t i;
 | 
			
		||||
 | 
			
		||||
    if (printf("%08zx: ", offset) < 0) {
 | 
			
		||||
| 
						 | 
				
			
			@ -96,13 +110,20 @@ static ssize_t dump_line(off_t offset, void *buf, size_t len) {
 | 
			
		|||
        uint8_t c = ((uint8_t *)buf)[offset+i];
 | 
			
		||||
 | 
			
		||||
        if (c < ZXDUMP_CHARSET_LEN) {
 | 
			
		||||
            uint16_t codepoint = charset[c];
 | 
			
		||||
            uint8_t sequence[4];
 | 
			
		||||
            if (zx_putchar(c) < 0) {
 | 
			
		||||
                goto error_io;
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            if (c >= 0xa0 && c <= 0xbf) {
 | 
			
		||||
                if (tty && printf("\033[7m") < 0) {
 | 
			
		||||
                    goto error_io;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            size_t len = utf8_encode(sequence, codepoint);
 | 
			
		||||
                if (zx_putchar(c - 0xa0) < 0) {
 | 
			
		||||
                    goto error_io;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            /* XXX: Implement support for inverse colours */
 | 
			
		||||
            if (fwrite(sequence, len, 1, stdout) < 1) {
 | 
			
		||||
                if (tty && printf("\033[27m") < 0) {
 | 
			
		||||
                    goto error_io;
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
| 
						 | 
				
			
			@ -111,6 +132,7 @@ static ssize_t dump_line(off_t offset, void *buf, size_t len) {
 | 
			
		|||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (putchar('\n') < 0) {
 | 
			
		||||
        goto error_io;
 | 
			
		||||
| 
						 | 
				
			
			@ -148,7 +170,7 @@ static ssize_t dump_fd(int fd) {
 | 
			
		|||
            size_t left   = len - i,
 | 
			
		||||
                   linesz = left < ZXDUMP_STRIDE_LINE? left: ZXDUMP_STRIDE_LINE;
 | 
			
		||||
 | 
			
		||||
            if (dump_line(offset, buf, linesz) < 0) {
 | 
			
		||||
            if (dump_line(offset, buf, linesz, isatty(fileno(stdout))) < 0) {
 | 
			
		||||
                goto error_dump_line;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue