interpolate.c (1587B)
1 #include <stdlib.h> 2 #include <stdio.h> 3 #include <string.h> 4 #include <unistd.h> 5 6 #define STEPS 32 7 8 /* SLEEPTIME in microseconds */ 9 #define SLEEPTIME 100 10 11 int 12 main(int argc, char *argv[]) 13 { 14 FILE *from, *to; 15 int i, j, k; 16 int width, height; 17 int fromn, ton; 18 size_t linesize; 19 ssize_t r; 20 char **fromlines, **tolines, *line; 21 char fromc, toc; 22 23 if (argc < 3) 24 return 1; 25 26 if (!(from = fopen(argv[1], "r"))) 27 return 1; 28 29 if (!(to = fopen(argv[2], "r"))) 30 return 1; 31 32 line = NULL; 33 linesize = 0; 34 width = 0; 35 36 fromn = 0; 37 fromlines = NULL; 38 while ((r = getline(&line, &linesize, from)) != -1) { 39 if (line[r-1] == '\n') 40 line[--r] = '\0'; 41 fromn++; 42 fromlines = realloc(fromlines, fromn * sizeof(*fromlines)); 43 fromlines[fromn-1] = strdup(line); 44 if (r > width) 45 width = r; 46 } 47 fclose(from); 48 49 ton = 0; 50 tolines = NULL; 51 while ((r = getline(&line, &linesize, to)) != -1) { 52 if (line[r-1] == '\n') 53 line[--r] = '\0'; 54 ton++; 55 tolines = realloc(tolines, ton * sizeof(*tolines)); 56 tolines[ton-1] = strdup(line); 57 if (r > width) 58 width = r; 59 } 60 fclose(to); 61 62 height = ton > fromn ? ton : fromn; 63 64 printf("\033[2J"); 65 for (k = 0; k <= STEPS; k++) { 66 printf("\033[;H"); 67 for (i = 0; i < height; i++) { 68 for (j = 0; j < width; j++) { 69 fromc = ' '; 70 toc = ' '; 71 if (i < fromn && j < strlen(fromlines[i])) 72 fromc = fromlines[i][j]; 73 if (i < ton && j < strlen(tolines[i])) 74 toc = tolines[i][j]; 75 if (toc & 128) 76 putchar(toc); 77 else 78 putchar(fromc + (toc - fromc) * k / STEPS); 79 } 80 putchar('\n'); 81 } 82 usleep(SLEEPTIME); 83 } 84 85 return 0; 86 }