logo

utils

~/.local/bin tools and git-hooks

xcd.c (1439B)


      1 // Copyright 2018-2020 Haelwenn (lanodan) Monnier <contact@hacktivis.me>
      2 // Distributed under the terms of the CC-BY-SA-4.0 license
      3 
      4 #include <stdio.h> /* printf(), fread() */
      5 #include <math.h> /* sin() */
      6 #include <stdint.h> /* uint8_t */
      7 #include <string.h> /* memset() */
      8 #include <ctype.h> /* isprint() */
      9 
     10 #define LANODAN_XCD_RESET printf("");
     11 #define LANODAN_XCD_PRINT printf(" >%s<", line);
     12 
     13 void rainbow(double freq, char i) {
     14 	uint8_t red, green, blue;
     15 	double pi = 3.14159;
     16 
     17 	red = sin(freq*i + 0) * 127 + 128;
     18 	green = sin(freq*i + 2*pi/3) * 127 + 128;
     19 	blue = sin(freq*i + 4*pi/3) * 127 + 128;
     20 
     21 	printf("[38;2;%02d;%02d;%02dm", red, green, blue);
     22 }
     23 
     24 int main(void) {
     25 	int cols = 0, bytes = 0;
     26 	int line_width = 16;
     27 	double freq = 0.2;
     28 	char c, line[line_width];
     29 
     30 	memset(&line, 0, line_width);
     31 
     32 	LANODAN_XCD_RESET
     33 
     34 	rainbow(freq, bytes);
     35 	printf("%06x ", bytes);
     36 	while(fread(&c, 1, 1, stdin) > 0)
     37 	{
     38 		if(cols >= line_width) {
     39 			cols = 0;
     40 
     41 			LANODAN_XCD_RESET
     42 			LANODAN_XCD_PRINT
     43 			memset(&line, 0, line_width);
     44 
     45 			rainbow(freq, bytes);
     46 			printf("\n%06x ", bytes);
     47 		}
     48 
     49 		rainbow(freq, c);
     50 		printf("%02hhx ", c);
     51 		line[cols] = isprint(c) ? c : '.';
     52 
     53 		cols++;
     54 		bytes++;
     55 	}
     56 
     57 
     58 	// Fill the rest of the hex space with spaces
     59 	for(cols; cols < line_width; cols++) printf("   ");
     60 
     61 	LANODAN_XCD_RESET
     62 	LANODAN_XCD_PRINT
     63 
     64 	rainbow(freq, bytes);
     65 	printf("\n%06x\n", bytes);
     66 	LANODAN_XCD_RESET
     67 
     68 	return 0;
     69 }