lchat

A line oriented chat front end for ii.
git clone git://git.suckless.org/lchat
Log | Files | Refs | README

indent.c (1933B)


      1 #include <stdbool.h>
      2 #include <stdio.h>
      3 #include <stdlib.h>
      4 #include <string.h>
      5 #include <time.h>
      6 #include <unistd.h>
      7 
      8 #include "../util.h"
      9 
     10 #define color1 37	/* message 1 */
     11 #define color2 97	/* message 2 */
     12 #define color3 31	/* bell match */
     13 #define color4 2	/* meta data */
     14 
     15 int
     16 main(void)
     17 {
     18 	char buf[BUFSIZ];
     19 	char timestr[BUFSIZ];
     20 	char old_nick[BUFSIZ] = "";
     21 	char *fmt = "%H:%M";
     22 	char *next, *nick, *word;
     23 	int cols = 80;		/* terminal width */
     24 	int color = color1;
     25 	char *bell_file = ".bellmatch";
     26 
     27 	while (fgets(buf, sizeof buf, stdin) != NULL) {
     28 		time_t time = strtol(buf, &next, 10);
     29 		struct tm *tm = localtime(&time);
     30 
     31 		next++;				/* skip space */
     32 
     33 		if (next == NULL || next[0] == '-' || time == 0) {
     34 			printf("\033[%dm%s\033[m", color4, buf);
     35 			fflush(stdout);
     36 			continue;
     37 		}
     38 
     39 		nick = strsep(&next, ">");
     40 		if (next == NULL) {
     41 			fputs(buf, stdout);
     42 			fflush(stdout);
     43 			continue;
     44 		}
     45 		nick++;				/* skip '<'   */
     46 		next++;				/* skip space */
     47 
     48 		strftime(timestr, sizeof timestr, fmt, tm);
     49 
     50 		/* swap color */
     51 		if (strcmp(nick, old_nick) != 0)
     52 			color = color == color1 ? color2 : color1;
     53 
     54 		if (access(bell_file, R_OK) == 0 && bell_match(next, bell_file))
     55 			color = color3;
     56 
     57 		/* print prompt */
     58 		/* HH:MM nnnnnnnnnnnn ttttttttttttt */
     59 		// e[7;30;40m
     60 		printf("\033[%dm\033[K%s %*s", color, timestr, 12,
     61 		    strcmp(nick, old_nick) == 0 ? "" : nick);
     62 
     63 		strlcpy(old_nick, nick, sizeof old_nick);
     64 
     65 		ssize_t pw = 18;	/* prompt width */
     66 		ssize_t tw = cols - pw;	/* text width */
     67 		bool first = true;
     68 
     69 		/* print indented text */
     70 		while ((word = strsep(&next, " ")) != NULL) {
     71 			tw -= strlen(word) + 1;
     72 			if (tw < 0 && !first)
     73 				printf("\n\033[%dm                  ", color);
     74 			if (tw < 0)
     75 				tw = cols - pw - strlen(word);
     76 
     77 			fputc(' ', stdout);
     78 			fputs(word, stdout);
     79 			first = false;
     80 		}
     81 		fputs("\033[0m\033[K", stdout);	/* turn color off */
     82 		fflush(stdout);
     83 	}
     84 
     85 	return EXIT_SUCCESS;
     86 }