ref: 4beba07146b277c8ca169c82e387687f6f8d0645
parent: 8b642a4c899bc049f1a1a8fedf7c174614619911
author: cancel <cancel@cancel.fm>
date: Mon Jan 6 20:45:49 EST 2020
Add start of prefs reading
--- /dev/null
+++ b/prefs.c
@@ -1,0 +1,111 @@
+#include "prefs.h"
+#include <ctype.h>
+
+ORCA_FORCE_NO_INLINE
+Readprefs_result prefs_read_line(FILE* file, char* buf, Usz bufsize,
+ Usz* out_strlen, char** out_left,
+ Usz* out_leftsize, char** out_right,
+ Usz* out_rightsize) {
+ Usz len, a0, a1, b0, b1;
+ char* s;
+ *out_strlen = 0;
+ if (bufsize < 2)
+ goto insufficient_buffer;
+#if SIZE_MAX > INT_MAX
+ if (bufsize > (Usz)INT_MAX)
+ exit(1); // he boot too big
+#endif
+ s = fgets(buf, (int)bufsize, file);
+ if (!s) {
+ if (feof(file))
+ goto eof;
+ goto ioerror;
+ }
+ len = strlen(buf);
+ if (len == bufsize - 1 && buf[len - 1] != '\n' && !feof(file))
+ goto insufficient_buffer;
+ *out_strlen = len - 1;
+ a0 = 0; // start of left
+ for (;;) {
+ if (a0 == len)
+ goto ignore;
+ char c = s[a0];
+ if (c == ';' || c == '#') // comment line, ignore
+ goto ignore;
+ if (c == '=') // '=' before any other char, bad
+ goto ignore;
+ if (!isspace(c))
+ break;
+ a0++;
+ }
+ a1 = a0; // end of left
+ for (;;) {
+ a1++;
+ if (a1 == len)
+ goto ignore;
+ char c = s[a1];
+ Usz x = a1;
+ while (isspace(c)) {
+ x++;
+ if (x == len)
+ goto ignore;
+ c = s[x];
+ }
+ if (c == '=') {
+ b0 = x;
+ break;
+ }
+ a1 = x;
+ }
+ for (;;) {
+ b0++;
+ if (b0 == len)
+ goto ignore;
+ char c = s[b0];
+ if (!isspace(c))
+ break;
+ }
+ b1 = b0; // end of right
+ for (;;) {
+ b1++;
+ if (b1 == len)
+ goto ok;
+ char c = s[b1];
+ Usz x = b1;
+ while (isspace(c)) {
+ x++;
+ if (x == len)
+ goto ok;
+ c = s[x];
+ }
+ b1 = x;
+ }
+ Readprefs_result err;
+insufficient_buffer:
+ err = Readprefs_buffer_too_small;
+ goto fail;
+eof:
+ err = Readprefs_eof;
+ goto fail;
+ioerror:
+ err = Readprefs_io_error;
+ goto fail;
+ignore:
+ s[len - 1] = '\0';
+ err = Readprefs_irrelevant;
+ goto fail;
+fail:
+ *out_left = NULL;
+ *out_leftsize = 0;
+ *out_right = NULL;
+ *out_rightsize = 0;
+ return err;
+ok:
+ s[a1] = '\0';
+ s[b1] = '\0';
+ *out_left = s + a0;
+ *out_leftsize = a1 - a0;
+ *out_right = s + b0;
+ *out_rightsize = b1 - b0;
+ return Readprefs_left_and_right;
+}
--- /dev/null
+++ b/prefs.h
@@ -1,0 +1,16 @@
+#pragma once
+#include "base.h"
+#include <stdio.h> // FILE cannot be forward declared
+
+typedef enum {
+ Readprefs_left_and_right = 0,
+ Readprefs_irrelevant,
+ Readprefs_buffer_too_small,
+ Readprefs_eof,
+ Readprefs_io_error,
+} Readprefs_result;
+
+Readprefs_result prefs_read_line(FILE* file, char* buf, Usz bufsize,
+ Usz* out_linelen, char** out_left,
+ Usz* out_leftlen, char** out_right,
+ Usz* out_rightlen);
--- a/tool
+++ b/tool
@@ -308,7 +308,7 @@
out_exe=cli
;;
orca|tui)
- add source_files osc_out.c term_util.c cboard.c tui_main.c
+ add source_files osc_out.c term_util.c cboard.c prefs.c tui_main.c
add cc_flags -D_XOPEN_SOURCE_EXTENDED=1
# thirdparty headers (like sokol_time.h) should get -isystem for their
# include dir so that any warnings they generate with our warning flags