pointtools

Simple point utilities to hold text presentations.
git clone git://r-36.net/pointtools
Log | Files | Refs | README | LICENSE

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 }