From 512239c77a63779649ee4a996e83f52f7f3b7a46 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 23 May 2022 22:54:19 +0200 Subject: [PATCH] Initial commit --- .gitignore | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ Makefile | 8 ++++++++ README.md | 3 +++ center.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 119 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 README.md create mode 100644 center.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a67d4e1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,55 @@ +# Prerequisites +*.d + +# Object files +*.o +*.ko +*.obj +*.elf + +# Linker output +*.ilk +*.map +*.exp + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ +*.su +*.idb +*.pdb + +# Kernel Module Compile Results +*.mod* +*.cmd +.tmp_versions/ +modules.order +Module.symvers +Mkfile.old +dkms.conf + +# Binaries +center diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..fba43e7 --- /dev/null +++ b/Makefile @@ -0,0 +1,8 @@ +PREFIX=/usr/local + +center: center.c + $(CC) center.c -o center -Wall -Wextra + +install: center + mkdir -p $(PREFIX)/bin + cp center $(PREFIX)/bin diff --git a/README.md b/README.md new file mode 100644 index 0000000..726e933 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# center +Centers text read from stdin in terminal. +UTF-8 is supported. 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; +} -- 2.44.0