From 778338e39c6abf799237b3fd56fe1f20c8d3eaad Mon Sep 17 00:00:00 2001
From: Holden Rohrer <hr@hrhr.dev>
Date: Mon, 30 Mar 2020 14:08:36 -0400
Subject: cmd and typeset framework added

---
 badroff.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 60 insertions(+), 2 deletions(-)

diff --git a/badroff.c b/badroff.c
index 592ac7e..8cf8961 100644
--- a/badroff.c
+++ b/badroff.c
@@ -1,5 +1,11 @@
 #include <stdio.h>
 #include "sb.h"
+#include "buf.h"
+
+typedef enum {
+    false,
+    true
+} bool;
 
 FILE* getfile(int argc, char** argv){
     if (argc >= 2)
@@ -9,15 +15,67 @@ FILE* getfile(int argc, char** argv){
 }
 
 FILE* in;
+buf* inbuf;
+
+int width;
+bool brk;
+
+
+size_t fillbuf(size_t len){ // returns real len
+    int c;
+    size_t set;
+    for (set = buflen(inbuf); set < len && (c = fgetc(in)) != EOF;set++)
+        inschrbuf(inbuf, c);
+    return set;
+}
+
+size_t nlfill(){
+    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++)
+        inschrbuf(inbuf, c);
+    return line;
+}
+
+void cmd(void){
+    int n = nlfill();
+    popstrbuf(inbuf, n);
+}
+
+char* typeset(void){
+    return popstrbuf(inbuf, nlfill());
+}
+
+char* line(void){
+    size_t sz;
+    if ( (sz = fillbuf(2)) == 0)
+        return "";
+    char* twobytes = peekstrbuf(inbuf, 0, 2); // .., .\n, or ^.?
+    if (sz == 1) return typeset();
+    if (twobytes[0] == '.' && twobytes[1] == '\n') return typeset();
+    if (twobytes[0] == '.') popchrbuf(inbuf);
+    if (twobytes[0] == '.' && twobytes[1] != '.'){
+        cmd();
+        return line();
+    } else {
+        return typeset();
+    }
+}
 
 int main(int argc, char** argv){
     int c;
     in = getfile(argc, argv);
+    inbuf = newbuf(256);
     if (in == NULL){
         perror(argv[1]);
         return 1;
     }
-    while ( (c = fgetc(in)) != EOF){
-        
+    char* out;
+    while ( (out = line())[0] != '\0'){
+        printf("%s",out);
     }
+    fclose(in);
 }
-- 
cgit