summaryrefslogtreecommitdiff
path: root/gn.c
diff options
context:
space:
mode:
Diffstat (limited to 'gn.c')
-rw-r--r--gn.c78
1 files changed, 52 insertions, 26 deletions
diff --git a/gn.c b/gn.c
index 58b5296..faae1f3 100644
--- a/gn.c
+++ b/gn.c
@@ -4,43 +4,29 @@
#include <string.h>
#include <stdlib.h>
+#include "tokens.h"
+#include "output.h"
+#include "util.h"
+
typedef enum mode {
NONE,
LIST,
+ CHECK,
+ OUTPUT,
} mode;
-typedef enum types {
- HEADING,
- DATE,
- TODO,
- BULLET,
-} types;
+typedef enum outputformats {
+ GOATNOTE,
+ HTML,
+ GROFF,
+} outputformats;
-typedef struct token {
- char data[256];
- types type;
-} token;
+outputformats outputformat;
mode m = NONE;
token tokens[1024];
int tokcount = 0;
-
-void eprint(char *msg) {
- fprintf(stderr, "error: %s\n", msg);
- exit(1);
-}
-
-void printashtml(token t) {
- char *start, *end;
- switch (t.type) {
- case HEADING: start = "<h1>"; end = "</h1>"; break;
- case DATE: start = "<h2>"; end = "</h2>"; break;
- case TODO: start = "<h3>"; end = "</h3>"; break;
- case BULLET: start = "<p>"; end = "</p>"; break;
- }
- printf("%s%s%s\n", start, t.data, end);
-}
char *stripwhitespace(char *expr) {
while (isblank(expr[0])) expr++;
@@ -50,6 +36,24 @@ char *stripwhitespace(char *expr) {
return expr;
}
+void formatcheck() {
+ types prev = NIL;
+ for (int i = 0; i < tokcount; i++) {
+ switch (prev) {
+ case NIL:
+ if (tokens[i].type != HEADING) eprint("Expected heading!");
+ break;
+ case HEADING:
+ if (tokens[i].type != DATE) eprint("Expected date");
+ break;
+ case DATE:
+ if (tokens[i].type != TODO) eprint("Expected todo|done marker");
+ break;
+ }
+ prev = tokens[i].type;
+ }
+}
+
int readuntil(char *file, int off, char end, types t) {
int j = 0;
char tok[256];
@@ -74,6 +78,15 @@ int readuntil(char *file, int off, char end, types t) {
int main(int argc, char **argv) {
for (int i = 0; i < argc && argc != 1; i++) {
if (strcmp(argv[i], "-l") == 0) m = LIST;
+ else if (strcmp(argv[i], "-c") == 0) m = CHECK;
+ else if (strcmp(argv[i], "-o") == 0) {
+ i++;
+ if (strcmp(argv[i], "goatnote") == 0) outputformat = GOATNOTE;
+ else if (strcmp(argv[i], "html") == 0) outputformat = HTML;
+ else if (strcmp(argv[i], "groff") == 0) outputformat = GROFF;
+
+ m = OUTPUT;
+ }
}
char file[INT16_MAX];
@@ -99,6 +112,19 @@ int main(int argc, char **argv) {
for (int i = 0; i < tokcount; i++)
if (tokens[i].type == HEADING) printf("%s\n", tokens[i].data);
break;
+ case CHECK:
+ formatcheck();
+ break;
+ case OUTPUT:
+ formatcheck();
+ for (int i = 0; i < tokcount; i++){
+ switch (outputformat) {
+ case HTML: printashtml(tokens[i]); break;
+ case GOATNOTE: printasgn(tokens[i]); break;
+ case GROFF: printasgroff(tokens[i]); break;
+ }
+ }
+
case NONE: return 0;
}
return 0;