/* This is a simple program that runs in an infinite loop. It reads strings * from standard input in the form of “str1:str2”, sorts them according to the * locale (set by gawk), and then prints out the first string in sorted order. * * The reason we use this instead of just sort(1) or something is because * spawning one process for each comparison is super slow. This lets us do * multiple comparisons of string-pairs in only a single process. */ #define _GNU_SOURCE #include #include #include #include #include int main(void) { char *s1, *s2, line[256]; /* We need line buffering to make gawk interact with this properly */ setvbuf(stdout, NULL, _IOLBF, 0); setlocale(LC_ALL, ""); while (true) { if (fgets(line, sizeof(line), stdin) == NULL) break; s1 = line; s2 = strchr(line, ':') + 1; s2[-1] = '\0'; *strchrnul(s2, '\n') = '\0'; puts(strcoll(s1, s2) < 0 ? s1 : s2); } return EXIT_SUCCESS; }