From 0c32b528c20f02b72a0842575d586ee63b490632 Mon Sep 17 00:00:00 2001 From: Holden Rohrer Date: Mon, 30 Mar 2020 15:01:53 -0400 Subject: added center cmd to badroff --- badroff.c | 40 ++++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/badroff.c b/badroff.c index 8cf8961..323cba2 100644 --- a/badroff.c +++ b/badroff.c @@ -1,6 +1,8 @@ #include #include "sb.h" #include "buf.h" +#include +#include typedef enum { false, @@ -17,9 +19,8 @@ FILE* getfile(int argc, char** argv){ FILE* in; buf* inbuf; -int width; -bool brk; - +int width = 80; +bool brk = false; // not implemented size_t fillbuf(size_t len){ // returns real len int c; @@ -29,24 +30,38 @@ size_t fillbuf(size_t len){ // returns real len return set; } -size_t nlfill(){ +size_t chrfill(char chr){ size_t line; size_t len = buflen(inbuf); char* str = peekstrbuf(inbuf, 0, len); for (line = 0; line < len; line++) - if (str[line] == '\n') return line+1; - for (int c = 0; c != '\n' && (c = fgetc(in)) != EOF; line++) + if (str[line] == chr) return line+1; + for (int c = 0; c != chr && (c = fgetc(in)) != EOF; line++) inschrbuf(inbuf, c); return line; } -void cmd(void){ - int n = nlfill(); - popstrbuf(inbuf, n); +char* center(char* text){ + size_t len = strlen(text); + int max = width/2 + len/2; // excluding terminator + int min = max-len+1; // first index of *text + char* str = malloc(sizeof(char)*(max + 1)); + str[max] = 0; + for (int i=0; i < min; i++) str[i] = ' '; + memcpy(str+min, text, len); + return str; +} + +char* cmd(void){ + char* dat = popstrbuf(inbuf, chrfill('\n')); + if (!strncmp(dat, "CT ", 3)){ + return center(dat+3); + } + return ""; } char* typeset(void){ - return popstrbuf(inbuf, nlfill()); + return popstrbuf(inbuf, chrfill('\n')); } char* line(void){ @@ -58,8 +73,9 @@ char* line(void){ if (twobytes[0] == '.' && twobytes[1] == '\n') return typeset(); if (twobytes[0] == '.') popchrbuf(inbuf); if (twobytes[0] == '.' && twobytes[1] != '.'){ - cmd(); - return line(); + char* data = cmd(); + if (data[0] != '\0') return data; + else return line(); } else { return typeset(); } -- cgit