]> git.lizzy.rs Git - center.git/commitdiff
Initial commit
authorElias Fleckenstein <eliasfleckenstein@web.de>
Mon, 23 May 2022 20:54:19 +0000 (22:54 +0200)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Mon, 23 May 2022 20:54:19 +0000 (22:54 +0200)
.gitignore [new file with mode: 0644]
Makefile [new file with mode: 0644]
README.md [new file with mode: 0644]
center.c [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..a67d4e1
--- /dev/null
@@ -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 (file)
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 (file)
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 (file)
index 0000000..e6f13b6
--- /dev/null
+++ b/center.c
@@ -0,0 +1,53 @@
+#define _POSIX_C_SOURCE 200809L
+#define _XOPEN_SOURCE
+#include <stdio.h>
+#include <wchar.h>
+#include <stdlib.h>
+#include <termios.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <locale.h>
+
+#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;
+}