diff options
author | Holden Rohrer <hr@hrhr.dev> | 2020-03-30 15:01:53 -0400 |
---|---|---|
committer | Holden Rohrer <hr@hrhr.dev> | 2020-03-30 15:01:53 -0400 |
commit | 0c32b528c20f02b72a0842575d586ee63b490632 (patch) | |
tree | b347f1357acb8849be268c7b479538e464a66e44 | |
parent | 778338e39c6abf799237b3fd56fe1f20c8d3eaad (diff) |
added center cmd to badroff
-rw-r--r-- | badroff.c | 40 |
1 files changed, 28 insertions, 12 deletions
@@ -1,6 +1,8 @@ #include <stdio.h> #include "sb.h" #include "buf.h" +#include <string.h> +#include <stdlib.h> 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(); } |