diff --git a/cboard.c b/cboard.c index adba999..2cea9cc 100644 --- a/cboard.c +++ b/cboard.c @@ -1,7 +1,8 @@ #include "cboard.h" #include "gbuffer.h" -#include +#include +ORCA_FORCE_NO_INLINE Cboard_error cboard_copy(Glyph const* gbuffer, Usz field_height, Usz field_width, Usz rect_y, Usz rect_x, Usz rect_h, Usz rect_w) { @@ -19,6 +20,7 @@ Cboard_error cboard_copy(Glyph const* gbuffer, Usz field_height, return status ? Cboard_error_process_exit_error : Cboard_error_none; } +ORCA_FORCE_NO_INLINE Cboard_error cboard_paste(Glyph* gbuffer, Usz height, Usz width, Usz y, Usz x, Usz* out_h, Usz* out_w) { FILE* fp = popen("xclip -o -selection clipboard 2>/dev/null", "r"); @@ -53,3 +55,113 @@ Cboard_error cboard_paste(Glyph* gbuffer, Usz height, Usz width, Usz y, Usz x, *out_w = max_x - start_x + 1; return status ? Cboard_error_process_exit_error : Cboard_error_none; } + +ORCA_FORCE_NO_INLINE +Conf_read_result conf_read_line(FILE* file, char* buf, Usz bufsize, + char** out_left, Usz* out_leftsize, + char** out_right, Usz* out_rightsize) { + Usz len, a0, a1, b0, b1; + char* s; + 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; + 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; + } + Conf_read_result err; +insufficient_buffer: + err = Conf_read_buffer_too_small; + goto fail; +eof: + err = Conf_read_eof; + goto fail; +ioerror: + err = Conf_read_io_error; + goto fail; +fail: + *out_left = NULL; + *out_leftsize = 0; + goto no_right; +ignore: + s[len - 1] = '\0'; + *out_left = s; + *out_leftsize = len; + err = Conf_read_irrelevant; + goto no_right; +no_right: + *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 Conf_read_left_and_right; +} diff --git a/cboard.h b/cboard.h index 757ef12..5a4e72d 100644 --- a/cboard.h +++ b/cboard.h @@ -1,5 +1,6 @@ #pragma once #include "base.h" +#include // FILE cannot be forward declared typedef enum { Cboard_error_none = 0, @@ -14,3 +15,15 @@ Cboard_error cboard_copy(Glyph const* gbuffer, Usz field_height, Cboard_error cboard_paste(Glyph* gbuffer, Usz height, Usz width, Usz y, Usz x, Usz* out_h, Usz* out_w); + +typedef enum { + Conf_read_left_and_right = 0, // left and right will be set + Conf_read_irrelevant, // only left will be set + Conf_read_buffer_too_small, // neither will be set + Conf_read_eof, // " + Conf_read_io_error, // " +} Conf_read_result; + +Conf_read_result conf_read_line(FILE* file, char* buf, Usz bufsize, + char** out_left, Usz* out_leftlen, + char** out_right, Usz* out_rightlen); diff --git a/prefs.c b/prefs.c deleted file mode 100644 index e97df3d..0000000 --- a/prefs.c +++ /dev/null @@ -1,112 +0,0 @@ -#include "prefs.h" -#include - -ORCA_FORCE_NO_INLINE -Conf_read_result conf_read_line(FILE* file, char* buf, Usz bufsize, - char** out_left, Usz* out_leftsize, - char** out_right, Usz* out_rightsize) { - Usz len, a0, a1, b0, b1; - char* s; - 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; - 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; - } - Conf_read_result err; -insufficient_buffer: - err = Conf_read_buffer_too_small; - goto fail; -eof: - err = Conf_read_eof; - goto fail; -ioerror: - err = Conf_read_io_error; - goto fail; -fail: - *out_left = NULL; - *out_leftsize = 0; - goto no_right; -ignore: - s[len - 1] = '\0'; - *out_left = s; - *out_leftsize = len; - err = Conf_read_irrelevant; - goto no_right; -no_right: - *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 Conf_read_left_and_right; -} diff --git a/prefs.h b/prefs.h deleted file mode 100644 index 049e6f7..0000000 --- a/prefs.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once -#include "base.h" -#include // FILE cannot be forward declared - -typedef enum { - Conf_read_left_and_right = 0, // left and right will be set - Conf_read_irrelevant, // only left will be set - Conf_read_buffer_too_small, // neither will be set - Conf_read_eof, // " - Conf_read_io_error, // " -} Conf_read_result; - -Conf_read_result conf_read_line(FILE* file, char* buf, Usz bufsize, - char** out_left, Usz* out_leftlen, - char** out_right, Usz* out_rightlen); diff --git a/tool b/tool index 69b6016..8d0e7ec 100755 --- a/tool +++ b/tool @@ -308,7 +308,7 @@ build_target() { out_exe=cli ;; orca|tui) - add source_files osc_out.c term_util.c cboard.c prefs.c tui_main.c + add source_files osc_out.c term_util.c cboard.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