From 512239c77a63779649ee4a996e83f52f7f3b7a46 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 23 May 2022 22:54:19 +0200 Subject: Initial commit --- center.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 center.c (limited to 'center.c') diff --git a/center.c b/center.c new file mode 100644 index 0000000..e6f13b6 --- /dev/null +++ b/center.c @@ -0,0 +1,53 @@ +#define _POSIX_C_SOURCE 200809L +#define _XOPEN_SOURCE +#include +#include +#include +#include +#include +#include +#include + +#define ERR(str) { perror(str); err = EXIT_FAILURE; break; } + +int main() +{ + if (setlocale(LC_ALL, "") == NULL) { + perror("setlocale"); + exit(EXIT_FAILURE); + } + + char *ptr = NULL; + size_t siz = 0; + ssize_t slen; + int err = EXIT_SUCCESS; + + while ((slen = getline(&ptr, &siz, stdin)) > 0) { + ptr[slen - 1] = '\0'; + + size_t len = mbstowcs(NULL, ptr, 0); + if (len == (size_t) -1) ERR("msbtowcs") + + wchar_t *wcs = calloc(len + 1, sizeof *wcs); + if (!wcs) ERR("calloc") + + if (mbstowcs(wcs, ptr, len + 1) == (size_t) -1) ERR("msbtowcs") + + struct winsize ws; + if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) < 0) ERR("ioctl") + + int trm_width = ws.ws_col; + int str_width = wcswidth(wcs, len); + + free(wcs); + + for (int i = (trm_width - str_width) / 2; i > 0; i--) + putchar(' '); + puts(ptr); + } + + if (ptr) + free(ptr); + + return err; +} -- cgit v1.2.3