hexedit.c revision 1b983744cde6819fe1d810e98cfac52585ceacaf
19ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley/* hexedit.c - Hexadecimal file editor 29ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley * 39ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley * Copyright 2015 Rob Landley <rob@landley.net> 49ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley * 59ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley * No standard 69ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley 75ea14bd1c246f7571d466d18385db22f59ac3262Rob LandleyUSE_HEXEDIT(NEWTOY(hexedit, "<1>1r", TOYFLAG_USR|TOYFLAG_BIN|TOYFLAG_LOCALE)) 89ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley 99ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landleyconfig HEXEDIT 109ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley bool "hexedit" 114c182c325716776a3e40394b175de479738e31a6Rob Landley default y 129ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley help 139ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley usage: hexedit FILENAME 149ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley 159ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley Hexadecimal file editor. 16ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley 17ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley -r Read only (display but don't edit) 189ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley*/ 199ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley 209ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley#define FOR_hexedit 219ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley#include "toys.h" 229ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley 239ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob LandleyGLOBALS( 249ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley char *data; 259ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley long long len, base; 263b5cb96b1080d26be10675227d6a6f91acf82519Rob Landley int numlen, undo, undolen; 279ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley unsigned height; 289ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley) 299ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley 303b5cb96b1080d26be10675227d6a6f91acf82519Rob Landley#define UNDO_LEN (sizeof(toybuf)/(sizeof(long long)+1)) 3153b0cb856deafa015626f21b5a2f972cddc015bdRob Landley 32ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley// Render all characters printable, using color to distinguish. 33e32e802240c5b3803b9769948dc7a18b3fc1630cRob Landleystatic int draw_char(FILE *fp, wchar_t broiled) 34ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley{ 35e32e802240c5b3803b9769948dc7a18b3fc1630cRob Landley if (fp) { 36e32e802240c5b3803b9769948dc7a18b3fc1630cRob Landley if (broiled<32 || broiled>=127) { 37e32e802240c5b3803b9769948dc7a18b3fc1630cRob Landley if (broiled>127) { 38e32e802240c5b3803b9769948dc7a18b3fc1630cRob Landley tty_esc("2m"); 39e32e802240c5b3803b9769948dc7a18b3fc1630cRob Landley broiled &= 127; 40e32e802240c5b3803b9769948dc7a18b3fc1630cRob Landley } 41e32e802240c5b3803b9769948dc7a18b3fc1630cRob Landley if (broiled<32 || broiled==127) { 42e32e802240c5b3803b9769948dc7a18b3fc1630cRob Landley tty_esc("7m"); 43e32e802240c5b3803b9769948dc7a18b3fc1630cRob Landley if (broiled==127) broiled = 32; 44e32e802240c5b3803b9769948dc7a18b3fc1630cRob Landley else broiled += 64; 45e32e802240c5b3803b9769948dc7a18b3fc1630cRob Landley } 46e32e802240c5b3803b9769948dc7a18b3fc1630cRob Landley printf("%c", broiled); 47e32e802240c5b3803b9769948dc7a18b3fc1630cRob Landley tty_esc("0m"); 48e32e802240c5b3803b9769948dc7a18b3fc1630cRob Landley } else printf("%c", broiled); 49e32e802240c5b3803b9769948dc7a18b3fc1630cRob Landley } 50e32e802240c5b3803b9769948dc7a18b3fc1630cRob Landley 51e32e802240c5b3803b9769948dc7a18b3fc1630cRob Landley return 1; 52ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley} 53ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley 545ea14bd1c246f7571d466d18385db22f59ac3262Rob Landleystatic void draw_tail(void) 555ea14bd1c246f7571d466d18385db22f59ac3262Rob Landley{ 56b20c80b603c1795c473b3957fd2538485ec4eb90Rob Landley tty_jump(0, TT.height); 57b20c80b603c1795c473b3957fd2538485ec4eb90Rob Landley tty_esc("K"); 585ea14bd1c246f7571d466d18385db22f59ac3262Rob Landley 59e32e802240c5b3803b9769948dc7a18b3fc1630cRob Landley draw_rstr(*toys.optargs, 71, draw_char); 605ea14bd1c246f7571d466d18385db22f59ac3262Rob Landley} 615ea14bd1c246f7571d466d18385db22f59ac3262Rob Landley 629ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landleystatic void draw_line(long long yy) 639ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley{ 64913a7796bb47e0b65c4f28920c39a87c6b6211ddRob Landley int x, xx = 16; 659ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley 669ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley yy = (TT.base+yy)*16; 67913a7796bb47e0b65c4f28920c39a87c6b6211ddRob Landley if (yy+xx>=TT.len) xx = TT.len-yy; 689ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley 699ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley if (yy<TT.len) { 709ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley printf("\r%0*llX ", TT.numlen, yy); 71913a7796bb47e0b65c4f28920c39a87c6b6211ddRob Landley for (x=0; x<xx; x++) printf(" %02X", TT.data[yy+x]); 72913a7796bb47e0b65c4f28920c39a87c6b6211ddRob Landley printf("%*s", 2+3*(16-xx), ""); 73e32e802240c5b3803b9769948dc7a18b3fc1630cRob Landley for (x=0; x<xx; x++) draw_char(stdout, TT.data[yy+x]); 74913a7796bb47e0b65c4f28920c39a87c6b6211ddRob Landley printf("%*s", 16-xx, ""); 759ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley } 76b20c80b603c1795c473b3957fd2538485ec4eb90Rob Landley tty_esc("K"); 779ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley} 789ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley 79ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landleystatic void draw_page(void) 809ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley{ 819ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley int y; 829ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley 83b20c80b603c1795c473b3957fd2538485ec4eb90Rob Landley tty_jump(0, 0); 849ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley for (y = 0; y<TT.height; y++) { 859ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley if (y) printf("\r\n"); 869ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley draw_line(y); 879ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley } 885ea14bd1c246f7571d466d18385db22f59ac3262Rob Landley draw_tail(); 899ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley} 909ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley 91ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley// side: 0 = editing left, 1 = editing right, 2 = clear, 3 = read only 92ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landleystatic void highlight(int xx, int yy, int side) 93ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley{ 94ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley char cc = TT.data[16*(TT.base+yy)+xx]; 95ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley int i; 96ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley 97ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley // Display cursor 98b20c80b603c1795c473b3957fd2538485ec4eb90Rob Landley tty_jump(2+TT.numlen+3*xx, yy); 99b20c80b603c1795c473b3957fd2538485ec4eb90Rob Landley tty_esc("0m"); 100b20c80b603c1795c473b3957fd2538485ec4eb90Rob Landley if (side!=2) tty_esc("7m"); 101ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley if (side>1) printf("%02X", cc); 102ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley else for (i=0; i<2;) { 103b20c80b603c1795c473b3957fd2538485ec4eb90Rob Landley if (side==i) tty_esc("32m"); 104ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley printf("%X", (cc>>(4*(1&++i)))&15); 105ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley } 106b20c80b603c1795c473b3957fd2538485ec4eb90Rob Landley tty_esc("0m"); 107b20c80b603c1795c473b3957fd2538485ec4eb90Rob Landley tty_jump(TT.numlen+17*3+xx, yy); 108e32e802240c5b3803b9769948dc7a18b3fc1630cRob Landley draw_char(stdout, cc); 109ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley} 110ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley 1119ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landleyvoid hexedit_main(void) 1129ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley{ 1134eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley long long pos = 0, y; 1144eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley int x, i, side = 0, key, ro = toys.optflags&FLAG_r, 115ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley fd = xopen(*toys.optargs, ro ? O_RDONLY : O_RDWR); 1163b5cb96b1080d26be10675227d6a6f91acf82519Rob Landley char keybuf[16]; 1179ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley 118671ce0c9298091f28c92430482b18c1449dcd09eRob Landley *keybuf = 0; 119671ce0c9298091f28c92430482b18c1449dcd09eRob Landley 120b20c80b603c1795c473b3957fd2538485ec4eb90Rob Landley // Terminal setup 1219ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley TT.height = 25; 1229ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley terminal_size(0, &TT.height); 12353b0cb856deafa015626f21b5a2f972cddc015bdRob Landley if (TT.height) TT.height--; 124b20c80b603c1795c473b3957fd2538485ec4eb90Rob Landley sigatexit(tty_sigreset); 125b20c80b603c1795c473b3957fd2538485ec4eb90Rob Landley tty_esc("0m"); 126b20c80b603c1795c473b3957fd2538485ec4eb90Rob Landley tty_esc("?25l"); 1279ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley fflush(0); 1281b983744cde6819fe1d810e98cfac52585ceacafRob Landley xset_terminal(1, 1, 0); 1299ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley 1309ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley if ((TT.len = fdlength(fd))<0) error_exit("bad length"); 1319ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley if (sizeof(long)==32 && TT.len>SIZE_MAX) TT.len = SIZE_MAX; 132b20c80b603c1795c473b3957fd2538485ec4eb90Rob Landley // count file length hex in digits, rounded up to multiple of 4 1339ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley for (pos = TT.len, TT.numlen = 0; pos; pos >>= 4, TT.numlen++); 1349ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley TT.numlen += (4-TT.numlen)&3; 1359ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley 136ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley TT.data = mmap(0, TT.len, PROT_READ|(PROT_WRITE*!ro), MAP_SHARED, fd, 0); 1379ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley draw_page(); 1389ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley 1399ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley for (;;) { 1404eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley // Scroll display if necessary 1414eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley if (pos<0) pos = 0; 1424eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley if (pos>TT.len) pos = TT.len-1; 1434eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley x = pos&15; 1444eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley y = pos/16; 1454eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley 1464eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley i = 0; 1474eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley while (y<TT.base) { 1484eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley if (TT.base-y>(TT.height/2)) { 1494eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley TT.base = y; 1504eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley draw_page(); 1514eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley } else { 1524eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley TT.base--; 1534eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley i++; 1544eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley tty_esc("1T"); 1554eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley tty_jump(0, 0); 1564eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley draw_line(0); 1574eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley } 1584eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley } 1594eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley while (y>=TT.base+TT.height) { 1604eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley if (y-(TT.base+TT.height)>(TT.height/2)) { 1614eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley TT.base = y-TT.height-1; 1624eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley draw_page(); 1634eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley } else { 1644eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley TT.base++; 1654eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley i++; 1664eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley tty_esc("1S"); 1674eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley tty_jump(0, TT.height-1); 1684eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley draw_line(TT.height-1); 1694eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley } 1709ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley } 1714eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley if (i) draw_tail(); 1724eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley y -= TT.base; 173ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley 1744eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley // Display cursor and flush output 175ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley highlight(x, y, ro ? 3 : side); 176d3a435e53c94ec25b4ae5fa2614f49ef8884e08aRob Landley xflush(); 1779ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley 178ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley // Wait for next key 179efb309d4cdb2f4c3926b0550d9dc1661c1e4a091Rob Landley key = scan_key(keybuf, -1); 180ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley // Exit for q, ctrl-c, ctrl-d, escape, or EOF 181ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley if (key==-1 || key==3 || key==4 || key==27 || key=='q') break; 182ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley highlight(x, y, 2); 183ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley 1843b5cb96b1080d26be10675227d6a6f91acf82519Rob Landley // Hex digit? 185ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley if (key>='a' && key<='f') key-=32; 186ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley if (!ro && ((key>='0' && key<='9') || (key>='A' && key<='F'))) { 1873b5cb96b1080d26be10675227d6a6f91acf82519Rob Landley if (!side) { 1883b5cb96b1080d26be10675227d6a6f91acf82519Rob Landley long long *ll = (long long *)toybuf; 1893b5cb96b1080d26be10675227d6a6f91acf82519Rob Landley 1903b5cb96b1080d26be10675227d6a6f91acf82519Rob Landley ll[TT.undo] = pos; 1913b5cb96b1080d26be10675227d6a6f91acf82519Rob Landley toybuf[(sizeof(long long)*UNDO_LEN)+TT.undo++] = TT.data[pos]; 1923b5cb96b1080d26be10675227d6a6f91acf82519Rob Landley if (TT.undolen < UNDO_LEN) TT.undolen++; 1933b5cb96b1080d26be10675227d6a6f91acf82519Rob Landley TT.undo %= UNDO_LEN; 1943b5cb96b1080d26be10675227d6a6f91acf82519Rob Landley } 1953b5cb96b1080d26be10675227d6a6f91acf82519Rob Landley 196ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley i = key - '0'; 197ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley if (i>9) i -= 7; 198ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley TT.data[pos] &= 15<<(4*side); 199ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley TT.data[pos] |= i<<(4*!side); 200ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley 2013b5cb96b1080d26be10675227d6a6f91acf82519Rob Landley if (++side==2) { 2023b5cb96b1080d26be10675227d6a6f91acf82519Rob Landley highlight(x, y, side); 203ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley side = 0; 2044eab65b911caf1f192d2ad6432d8b2473961be0dRob Landley ++pos; 205ed753aaa5481e487a23c9e0e6a855c09612eb7ceRob Landley } 2063b5cb96b1080d26be10675227d6a6f91acf82519Rob Landley } else side = 0; 2073b5cb96b1080d26be10675227d6a6f91acf82519Rob Landley if (key=='u') { 2083b5cb96b1080d26be10675227d6a6f91acf82519Rob Landley if (TT.undolen) { 2093b5cb96b1080d26be10675227d6a6f91acf82519Rob Landley long long *ll = (long long *)toybuf; 2103b5cb96b1080d26be10675227d6a6f91acf82519Rob Landley 2113b5cb96b1080d26be10675227d6a6f91acf82519Rob Landley TT.undolen--; 2123b5cb96b1080d26be10675227d6a6f91acf82519Rob Landley if (!TT.undo) TT.undo = UNDO_LEN; 2133b5cb96b1080d26be10675227d6a6f91acf82519Rob Landley pos = ll[--TT.undo]; 2143b5cb96b1080d26be10675227d6a6f91acf82519Rob Landley TT.data[pos] = toybuf[sizeof(long long)*UNDO_LEN+TT.undo]; 2153b5cb96b1080d26be10675227d6a6f91acf82519Rob Landley } 2164b4ab6a50998219cd94139c5669ef9a624c8f58fRob Landley } 2174b4ab6a50998219cd94139c5669ef9a624c8f58fRob Landley if (key>256) { 2184b4ab6a50998219cd94139c5669ef9a624c8f58fRob Landley key -= 256; 2194b4ab6a50998219cd94139c5669ef9a624c8f58fRob Landley 2204b4ab6a50998219cd94139c5669ef9a624c8f58fRob Landley if (key==KEY_UP) pos -= 16; 2214b4ab6a50998219cd94139c5669ef9a624c8f58fRob Landley else if (key==KEY_DOWN) pos += 16; 2224b4ab6a50998219cd94139c5669ef9a624c8f58fRob Landley else if (key==KEY_RIGHT) { 2234b4ab6a50998219cd94139c5669ef9a624c8f58fRob Landley if (x<15) pos++; 2244b4ab6a50998219cd94139c5669ef9a624c8f58fRob Landley } else if (key==KEY_LEFT) { 2254b4ab6a50998219cd94139c5669ef9a624c8f58fRob Landley if (x) pos--; 2264b4ab6a50998219cd94139c5669ef9a624c8f58fRob Landley } else if (key==KEY_PGUP) pos -= 16*TT.height; 2274b4ab6a50998219cd94139c5669ef9a624c8f58fRob Landley else if (key==KEY_PGDN) pos += 16*TT.height; 2284b4ab6a50998219cd94139c5669ef9a624c8f58fRob Landley else if (key==KEY_HOME) pos = 0; 2294b4ab6a50998219cd94139c5669ef9a624c8f58fRob Landley else if (key==KEY_END) pos = TT.len-1; 2304b4ab6a50998219cd94139c5669ef9a624c8f58fRob Landley } 2319ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley } 2329ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley munmap(TT.data, TT.len); 2339ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley close(fd); 234b20c80b603c1795c473b3957fd2538485ec4eb90Rob Landley tty_reset(); 2359ac2d6546a2154a6797e12dfe86f36cc9420d6d4Rob Landley} 236