]> git.lizzy.rs Git - center.git/blob - center.c
Initial commit
[center.git] / center.c
1 #define _POSIX_C_SOURCE 200809L
2 #define _XOPEN_SOURCE
3 #include <stdio.h>
4 #include <wchar.h>
5 #include <stdlib.h>
6 #include <termios.h>
7 #include <unistd.h>
8 #include <sys/ioctl.h>
9 #include <locale.h>
10
11 #define ERR(str) { perror(str); err = EXIT_FAILURE; break; }
12
13 int main()
14 {
15         if (setlocale(LC_ALL, "") == NULL) {
16                 perror("setlocale");
17                 exit(EXIT_FAILURE);
18         }
19
20         char *ptr = NULL;
21         size_t siz = 0;
22         ssize_t slen;
23         int err = EXIT_SUCCESS;
24
25         while ((slen = getline(&ptr, &siz, stdin)) > 0) {
26                 ptr[slen - 1] = '\0';
27         
28                 size_t len = mbstowcs(NULL, ptr, 0);
29                 if (len == (size_t) -1) ERR("msbtowcs")
30
31                 wchar_t *wcs = calloc(len + 1, sizeof *wcs);
32                 if (!wcs) ERR("calloc")
33
34                 if (mbstowcs(wcs, ptr, len + 1) == (size_t) -1) ERR("msbtowcs")
35
36                 struct winsize ws;
37                 if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) < 0) ERR("ioctl")
38
39                 int trm_width = ws.ws_col;
40                 int str_width = wcswidth(wcs, len);
41
42                 free(wcs);
43
44                 for (int i = (trm_width - str_width) / 2; i > 0; i--)
45                         putchar(' ');
46                 puts(ptr);
47         }
48
49         if (ptr)
50                 free(ptr);
51
52         return err;
53 }