aboutsummaryrefslogtreecommitdiff
path: root/draw.c
diff options
context:
space:
mode:
Diffstat (limited to 'draw.c')
-rw-r--r--draw.c107
1 files changed, 65 insertions, 42 deletions
diff --git a/draw.c b/draw.c
index 55c840f..d6a032b 100644
--- a/draw.c
+++ b/draw.c
@@ -2,20 +2,22 @@
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
+#include <wchar.h>
#include "sayeth.h"
size_t START_Y_BOX = 0;
size_t START_Y_CARET = 0;
size_t START_Y_DATA = 0;
-const char *A_TAB = " ";
-char wspace = ' ';
-char box_top_left = '\0';
-char box_top = '\0';
-char box_top_right = '\0';
-char box_side = '\0';
-char box_bottom_left = '\0';
-char box_bottom = '\0';
-char box_bottom_right = '\0';
+const wchar_t *A_TAB = L" ";
+wchar_t wspace = L' ';
+wchar_t box_top_left = L'\0';
+wchar_t box_top = L'\0';
+wchar_t box_top_right = L'\0';
+wchar_t box_side = L'\0';
+wchar_t box_bottom_left = L'\0';
+wchar_t box_bottom = L'\0';
+wchar_t box_bottom_right = L'\0';
+extern int do_fill;
void box_draw_top(size_t y, size_t longest) {
repchar(wspace, y);
@@ -41,20 +43,20 @@ void box_draw_end_line(size_t longest, size_t len) {
repchar(box_side, 1);
}
-int box_printf(const char *fmt, ...) {
+int box_printf(const wchar_t *fmt, ...) {
int count;
va_list list;
va_start(list, fmt);
size_t len = 0;
- char data[INPUT_BUFSIZ] = {0};
- char output[INPUT_BUFSIZ] = {0};
- count = vsnprintf(data, sizeof(data) - 1, fmt, list);
+ wchar_t data[INPUT_BUFSIZ] = {0};
+ wchar_t output[INPUT_BUFSIZ] = {0};
+ count = vswprintf(data, sizeof(data) - 1, fmt, list);
// convert tabs to spaces
- for (size_t i = 0, n = 0; i < strlen(data) && n < sizeof(output); i++, n++) {
- if (data[i] == '\t') {
- strcat(&output[n], A_TAB);
- n = n + strlen(A_TAB) - 1;
+ for (size_t i = 0, n = 0; i < wcslen(data) && n < sizeof(output); i++, n++) {
+ if (data[i] == L'\t') {
+ wcscat(&output[n], A_TAB);
+ n = n + wcslen(A_TAB) - 1;
continue;
}
output[n] = data[i];
@@ -63,10 +65,10 @@ int box_printf(const char *fmt, ...) {
size_t longest = get_longest_line(output);
box_draw_top(START_Y_BOX, longest);
- puts("");
+ wprintf(L"\n");
- for (size_t i = 0; i < strlen(output); i++) {
- if (i == strlen(output) - 1) {
+ for (size_t i = 0; i < wcslen(output); i++) {
+ if (i == wcslen(output) - 1) {
box_draw_end_line(longest, len);
continue;
}
@@ -77,36 +79,36 @@ int box_printf(const char *fmt, ...) {
if (output[i] == '\n') {
box_draw_end_line(longest, len);
- putc('\n', stdout);
+ putwc('\n', stdout);
len = 0;
continue;
}
- putc(output[i], stdout);
+ putwc(output[i], stdout);
len++;
}
- puts("");
+ wprintf(L"\n");
box_draw_bottom(START_Y_BOX, longest);
va_end(list);
return count;
}
-void caret_draw(char *data, size_t indent, size_t attached) {
- if (!strlen(data))
+void caret_draw(wchar_t *data, size_t indent, size_t attached) {
+ if (!wcslen(data))
return;
if (!attached)
repchar(wspace, START_Y_BOX);
- for (size_t i = 0; i < strlen(data); i++) {
- if (data[i] == '\\' && isalpha(data[i + 1])) {
+ for (size_t i = 0; i < wcslen(data); i++) {
+ if (data[i] == L'\\' && isalpha(data[i + 1])) {
i++;
switch (data[i]) {
case 'n':
- putc('\n', stdout);
- if (i == strlen(data) - 1)
+ putwc(L'\n', stdout);
+ if (i == wcslen(data) - 1)
continue;
repchar(wspace, indent);
continue;
@@ -114,25 +116,46 @@ void caret_draw(char *data, size_t indent, size_t attached) {
continue;
}
}
- putc(data[i], stdout);
+ putwc(data[i], stdout);
}
}
+size_t count_lines(wchar_t *s) {
+ size_t count = 0;
+ wchar_t *ptr = s;
-void data_draw(char *data, size_t indent) {
+ while (*ptr != L'\0') {
+ if (*ptr == L'\n')
+ count++;
+ ptr++;
+ }
+ return count;
+}
+
+void data_draw(wchar_t *data, size_t indent) {
size_t len = 0;
- for (size_t i = 0; i < strlen(data); i++) {
- if (len == 0) {
- repchar(wspace, indent);
+ wchar_t *inbuf = wcsdup(data);
+ size_t longest = get_longest_line(inbuf);
+ size_t lines = count_lines(inbuf);
+ wchar_t buf[DATA_BUFSIZ] = {0};
+
+ wchar_t *token = NULL;
+ wchar_t *ptr;
+ token = wcstok(inbuf, L"\n", &ptr);
+ for (size_t i = 0; token != NULL; i++) {
+ memset(buf, '\0', sizeof(buf));
+ for (size_t y = 0; y < indent; y++) {
+ buf[y] = wspace;
}
-
- if (data[i] == '\n') {
- putc('\n', stdout);
- len = 0;
- continue;
+ wcscat(buf, token);
+ len = wcslen(buf);
+ if (i < lines) {
+ for (size_t y = len; y < longest + (indent * 2); y++) {
+ buf[y] = wspace;
+ }
+ wcscat(buf, L"\n");
}
-
- putc(data[i], stdout);
- len++;
+ wprintf(L"%S", buf);
+ token = wcstok(NULL, L"\n", &ptr);
}
}