├── usage.png ├── .travis.yml ├── README.md ├── src ├── tty.h ├── core.h └── core.c └── makefile /usage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/but0n/xd/HEAD/usage.png -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | os: osx 2 | osx_image: xcode 3 | language: c 4 | before_install: make 5 | script: make clean 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # xd 2 | [![Build Status](https://travis-ci.org/but0n/xd.svg?branch=master)](https://travis-ci.org/but0n/xd) 3 | 4 | ![](usage.png) 5 | 6 | A little toy to preview a hex dump of a given file, just like xxd 7 | 8 | ``` 9 | $ make 10 | ``` 11 | - Cross compile and launch unit test 12 | 13 | ``` 14 | $ make install 15 | ``` 16 | - Copy this excutable file to /usr/local/bin 17 | 18 | ``` 19 | $ make uninstall 20 | ``` 21 | - Uninstall 22 | 23 | ``` 24 | $ make clean 25 | ``` 26 | - Clean -------------------------------------------------------------------------------- /src/tty.h: -------------------------------------------------------------------------------- 1 | #ifndef TTY_H 2 | #define TTY_H 3 | 4 | #define TTY_NONE "\033[m" 5 | #define TTY_RED "\033[41;30m" 6 | #define TTY_LIGHT_RED "\033[1;31m" 7 | #define TTY_GREEN "\033[0;32;32m" 8 | #define TTY_LIGHT_GREEN "\033[1;32m" 9 | #define TTY_BLUE "\033[0;36m" 10 | #define TTY_LIGHT_BLUE "\033[1;34m" 11 | #define TTY_DARY_GRAY "\033[1;30m" 12 | #define TTY_CYAN "\033[0;36m" 13 | #define TTY_LIGHT_CYAN "\033[1;36m" 14 | #define TTY_PURPLE "\033[0;35m" 15 | #define TTY_LIGHT_PURPLE "\033[1;35m" 16 | #define TTY_BROWN "\033[0;33m" 17 | #define TTY_YELLOW "\033[1;33m" 18 | #define TTY_LIGHT_GRAY "\033[0;37m" 19 | #define TTY_WHITE "\033[1;37m" 20 | 21 | #define TTY_COLORRTN "\33[7m" 22 | #define TTY_CLEAR "\33[2J" 23 | #define TTY_UNDERLINE "\33[4m" 24 | #define TTY_FLASH "\33[5m" 25 | #define TTY_OPTOFF "\33[0m" 26 | 27 | #endif 28 | -------------------------------------------------------------------------------- /makefile: -------------------------------------------------------------------------------- 1 | TARGET=xd 2 | CC=gcc 3 | LIBDIR=-I. 4 | COMMONFLAGS=-Wall -std=c99 5 | # COMMONFLAGS+=-F/Library/Frameworks 6 | 7 | LIDLIBS+=-lm 8 | 9 | CFLAGS=$(COMMONFLAGS) $(LIBDIR) 10 | 11 | # Custom TTY 12 | CUTLINE=-------------------------------------------------------------> 13 | TTY_NONE=\033[m 14 | TTY_RED=\033[1;31m 15 | TTY_GREEN=\033[1;32m 16 | TTY_PURPLE=\033[1;35m 17 | 18 | all:$(TARGET) 19 | @echo "$< Build Over $(CUTLINE) $(TTY_GREEN)" 20 | @echo "Launching...." 21 | @echo "$(TTY_NONE)" 22 | ./$< -c -l 20 makefile 23 | 24 | $(TARGET):src/*.c src/*.h 25 | @echo "Compiling $< $(CUTLINE) $(TTY_RED)" 26 | $(CC) $(CFLAGS) -o $@ $< 27 | @echo "$(TTY_NONE)" 28 | 29 | install:$(TARGET) 30 | @echo "$@ $(CUTLINE)" 31 | cp $< /usr/local/bin/ 32 | 33 | uninstall: 34 | rm /usr/local/bin/xd 35 | 36 | .PHONY: clean unsintall 37 | clean: 38 | rm -rf $(TARGET) 39 | -------------------------------------------------------------------------------- /src/core.h: -------------------------------------------------------------------------------- 1 | #ifndef CORE_H 2 | #define CORE_H 3 | 4 | void handleFile(FILE *fileCache); 5 | void read(const char *filename); 6 | void setupOptReg(const char *flag); 7 | void printEmptyBin(unsigned char len); 8 | 9 | char const gHelp[] = 10 | " https://github.com/but0n/xd\n" 11 | "\n" 12 | " Usage: xd \n" 13 | "\n" 14 | " Options:\n" 15 | "\n" 16 | " -c : turn colorization on always\n" 17 | " -l len : stop after octets.\n" 18 | "\n" 19 | " -h : Displays this usage screen\n" 20 | ""; 21 | 22 | unsigned short gOptRegister = 0; // Default Options 23 | 24 | #define FLAG_HELP 'h' 25 | #define FLAG_COLOR 'c' 26 | #define FLAG_LENGTH 'l' 27 | 28 | #define ENABLE_COLOR 0b0000000000000001 29 | #define ENABLE_USAGE 0b0000000000000010 30 | #define ENABLE_STOP 0b0000000000000100 31 | #define LEN 0b1111111111111000 32 | #define LEN_OFFSET 3 33 | 34 | #define GET_LEN() (gOptRegister & LEN)>>LEN_OFFSET 35 | #define ISENABLE(opt) gOptRegister & (opt) 36 | 37 | #define PRINTCOLOR(color) {\ 38 | if(ISENABLE(ENABLE_COLOR))\ 39 | printf(color);\ 40 | } 41 | 42 | 43 | #endif 44 | -------------------------------------------------------------------------------- /src/core.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include "core.h" 4 | #include "tty.h" 5 | 6 | #define BLANK '.' // You can custom blank character by redefine here 7 | #define PRINTUSAGE() {printf("%s\n", gHelp);} 8 | 9 | void handleFile(FILE *fileCache) { 10 | unsigned char cache; 11 | unsigned int size = 0; 12 | char ascii[16] = {}; 13 | while(fread((char*)&cache, sizeof(cache), 1, fileCache)) { 14 | if (!(size%0x10)) { 15 | PRINTCOLOR(TTY_BLUE); 16 | printf("\n%08x: ", size); 17 | PRINTCOLOR(TTY_NONE); 18 | } 19 | else if (!(size%8)) { 20 | // After per 8 bytes insert two space for split 21 | printf(" "); // More readable 22 | } 23 | 24 | // handle Ascii detail area, store current byte 25 | ascii[size%16] = ((cache >= '!') && (cache <= '~')) ? cache : BLANK; 26 | 27 | // print current byte 28 | PRINTCOLOR(TTY_GREEN); 29 | printf("%02x ", cache); 30 | PRINTCOLOR(TTY_NONE); 31 | 32 | size++; 33 | 34 | if (!(size%16) || (size == gOptRegister>>LEN_OFFSET)) { 35 | // Empty bytes 36 | printEmptyBin(size%16); 37 | PRINTCOLOR(TTY_LIGHT_BLUE); 38 | printf(" %s", ascii); 39 | PRINTCOLOR(TTY_NONE); 40 | if (size == gOptRegister>>LEN_OFFSET) 41 | break; 42 | } 43 | } 44 | printf("\nTotal %d Byte\n", size); 45 | } 46 | 47 | 48 | void read(const char *filename) { 49 | printf("File name: %s\n", filename); 50 | FILE *fp = NULL; 51 | if ((fp = fopen(filename, "rb")) == NULL) 52 | printf("Couldn't open this file\n"); 53 | else { 54 | handleFile(fp); 55 | } 56 | fclose(fp); 57 | fp = NULL; 58 | } 59 | 60 | void setupOptReg(const char *flag) { 61 | while(*++flag) { 62 | //TODO: Enhancement 63 | switch (*flag) { 64 | case FLAG_HELP: 65 | gOptRegister |= ENABLE_USAGE; 66 | PRINTUSAGE(); 67 | break; 68 | case FLAG_COLOR: 69 | gOptRegister |= ENABLE_COLOR; 70 | break; 71 | case FLAG_LENGTH: 72 | gOptRegister |= ENABLE_STOP; 73 | break; 74 | default: 75 | printf("Error option '%c'\n", *flag); 76 | break; 77 | } 78 | } 79 | } 80 | 81 | void printEmptyBin(unsigned char len) { 82 | if (len) { 83 | len = 16 - len; 84 | while(len--) { 85 | printf(" "); 86 | if (len==8) 87 | printf(" "); 88 | } 89 | } 90 | } 91 | 92 | int main(int argc, char const *argv[]) { 93 | // handle arguments 94 | if (argc == 1) { 95 | PRINTUSAGE(); 96 | return -1; 97 | } 98 | for(int count = 1; count < argc; count++) { 99 | if(argv[count][0] == '-') { 100 | // Handle options 101 | setupOptReg(argv[count]); 102 | if (ISENABLE(ENABLE_STOP)) { 103 | gOptRegister |= atoi(argv[count+1]) << LEN_OFFSET; 104 | count++; 105 | gOptRegister &= ~ENABLE_STOP; 106 | //Clean ENABLE_STOP bit after enable 107 | } 108 | } else { 109 | // Handle infile 110 | read(argv[count]); 111 | } 112 | } 113 | return 0; 114 | } 115 | --------------------------------------------------------------------------------