From 500892b2ae64676d1855d8a357cd39e8a9e7f6c2 Mon Sep 17 00:00:00 2001 From: Thomas Voss Date: Fri, 1 Nov 2024 00:49:32 +0100 Subject: Add support for $GRAB_TABSIZE --- src/flags.h | 24 ------------------------ src/globals.h | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.c | 13 +++---------- src/tpool.c | 35 ++++++----------------------------- src/util.c | 20 ++++++++++++++++++++ src/util.h | 1 + src/work.c | 9 ++------- src/work.h | 12 +----------- 8 files changed, 84 insertions(+), 81 deletions(-) delete mode 100644 src/flags.h create mode 100644 src/globals.h (limited to 'src') diff --git a/src/flags.h b/src/flags.h deleted file mode 100644 index fbd957d..0000000 --- a/src/flags.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef GRAB_FLAGS_H -#define GRAB_FLAGS_H - -typedef struct { - bool b : 1; - bool c : 1; - bool i : 1; - bool l : 1; - bool p : 1; - bool s : 1; - bool U : 1; - bool z : 1; - -#if !GIT_GRAB - bool do_header : 1; -#endif -} flags_t; - -#if !MAIN_C -extern -#endif -flags_t flags; - -#endif /* !GRAB_FLAGS_H */ diff --git a/src/globals.h b/src/globals.h new file mode 100644 index 0000000..9475bc3 --- /dev/null +++ b/src/globals.h @@ -0,0 +1,51 @@ +#ifndef GRAB_GLOBALS_H +#define GRAB_GLOBALS_H + +#include + +#include + +#include "exitcodes.h" + +typedef struct { + char c; + pcre2_code *re; +#if DEBUG + bool free_me; +#endif +} op_t; + +typedef struct { + bool b : 1; + bool c : 1; + bool i : 1; + bool l : 1; + bool p : 1; + bool s : 1; + bool U : 1; + bool z : 1; + +#if !GIT_GRAB + bool do_header : 1; +#endif +} flags_t; + +#if MAIN_C + #define maybe_extern +#else + #define maybe_extern extern +#endif + +maybe_extern flags_t flags; +maybe_extern int grab_tabsize; +maybe_extern op_t *ops; +maybe_extern typeof(pcre2_match) *pcre2_match_fn; +#if MAIN_C + atomic_int rv = EXIT_NOMATCH; + const char *lquot = "`", *rquot = "'"; +#else + extern atomic_int rv; + extern const char *lquot, *rquot; +#endif + +#endif /* !GRAB_GLOBALS_H */ \ No newline at end of file diff --git a/src/main.c b/src/main.c index e004f1e..221e795 100644 --- a/src/main.c +++ b/src/main.c @@ -23,7 +23,7 @@ #include "work.h" #define MAIN_C 1 -#include "flags.h" +#include "globals.h" static bool use_color_p(void); static op_t *pattern_comp(u8view_t pat); @@ -31,15 +31,6 @@ static op_t *pattern_comp(u8view_t pat); static FILE *getfstream(int globc, char **globv); #endif -atomic_int rv = EXIT_NOMATCH; -op_t *ops; -/* For use in diagnostic messages */ -const char *lquot = "`", *rquot = "'"; - -/* We need to use different matching functions depending on if we’re using JIT - matching or not */ -typeof(pcre2_match) *pcre2_match_fn; - /* TODO: Use the LUT in work.c */ static const bool opchars[] = { ['g'] = true, @@ -72,6 +63,8 @@ main(int argc, char **argv) rquot = u8"’"; } + grab_tabsize = getenv_posnum("GRAB_TABSIZE", 8); + optparser_t parser = mkoptparser(argv); static const cli_opt_t opts[] = { {'b', U8C("byte-offset"), CLI_NONE}, diff --git a/src/tpool.c b/src/tpool.c index 7fe93b8..3e8a0de 100644 --- a/src/tpool.c +++ b/src/tpool.c @@ -13,7 +13,9 @@ #include #include +#include "globals.h" #include "tpool.h" +#include "util.h" #include "work.h" static int nproc(void); @@ -21,37 +23,12 @@ static void *tpwork(void *); static pthread_t thread_buffer[32]; -extern const char *lquot, *rquot; - int nproc(void) { - errno = 0; - - /* Grab the number of processors available on the users system. If we can - we query sysconf() but fallback to 1 for systems that don’t support the - sysconf() method. The user can also override this via the GRAB_NPROCS - environment variable, and if that’s invalid then we just issue a - diagnostic and default to 1. - - We don’t want to error on an invalid value for GRAB_NPROCS because we - might be running this tool as part of an editor plugin for example where - finding the root cause of your regexp-search failing may not be so - trivial. */ - - const char *ev = getenv("GRAB_NPROCS"); - if (ev != nullptr && *ev != 0) { - const char *endptr; - long n = strtol(ev, (char **)&endptr, 10); - if (errno == 0 && *endptr == 0) - return (int)n; - if (errno != 0) - warn("strtol: %s:", ev); - if (*endptr != 0) - warn("Invalid value for %s%s%s for GRAB_NPROCS", lquot, ev, rquot); - return 1; - } - + int np = getenv_posnum("GRAB_NPROCS", -1); + if (np != -1) + return np; #ifdef _SC_NPROCESSORS_ONLN return (int)sysconf(_SC_NPROCESSORS_ONLN); #else @@ -121,4 +98,4 @@ tpwork(void *arg) array_free(buf); #endif return nullptr; -} +} \ No newline at end of file diff --git a/src/util.c b/src/util.c index d20611f..bf18111 100644 --- a/src/util.c +++ b/src/util.c @@ -1,10 +1,12 @@ #include #include +#include #include #include #include "exitcodes.h" +#include "globals.h" void pcre2_bitch_and_die(int ec, const char *fmt) @@ -21,4 +23,22 @@ pcre2_bitch_and_die(int ec, const char *fmt) } else cerr(EXIT_FATAL, fmt, buf); } +} + +int +getenv_posnum(const char *ev, int fallback) +{ + const char *s = getenv(ev); + if (s != nullptr && *s != 0) { + const char *endptr; + errno = 0; + long n = strtol(s, (char **)&endptr, 10); + if (errno != 0) + warn("strtol: %s:", s); + else if (*endptr != 0 || n <= 0) + warn("invalid value %s%s%s for %s", lquot, s, rquot, ev); + else + return (int)n; + } + return fallback; } \ No newline at end of file diff --git a/src/util.h b/src/util.h index d2909ce..bb2ca16 100644 --- a/src/util.h +++ b/src/util.h @@ -1,6 +1,7 @@ #ifndef GRAB_UTIL_H #define GRAB_UTIL_H +int getenv_posnum(const char *ev, int fallback); void pcre2_bitch_and_die(int ec, const char *fmt); #endif /* !GRAB_UTIL_H */ \ No newline at end of file diff --git a/src/work.c b/src/work.c index 6e658db..62f997e 100644 --- a/src/work.c +++ b/src/work.c @@ -21,7 +21,7 @@ #include #include "exitcodes.h" -#include "flags.h" +#include "globals.h" #include "util.h" #include "work.h" @@ -64,11 +64,6 @@ static typeof(operator_dispatch) *operators[] = { ['X'] = operator_X, }; -extern atomic_int rv; -extern op_t *ops; -extern bool cflag; -extern typeof(pcre2_match) *pcre2_match_fn; - void @@ -454,7 +449,7 @@ compute_pos(const char8_t *p, pos_state_t *ps) ps->row++; ps->col = 0; } else - ps->col = ucswdth(g, ps->col, 8); /* TODO: Configurable tabsize? */ + ps->col = ucswdth(g, ps->col, grab_tabsize); } } diff --git a/src/work.h b/src/work.h index 644a244..c77a5a6 100644 --- a/src/work.h +++ b/src/work.h @@ -1,16 +1,6 @@ #ifndef GRAB_WORK_H #define GRAB_WORK_H -#include - -typedef struct { - char c; - pcre2_code *re; -#if DEBUG - bool free_me; -#endif -} op_t; - void process_file(const char *filename, unsigned char **buf); -#endif /* !GRAB_WORK_H */ +#endif /* !GRAB_WORK_H */ \ No newline at end of file -- cgit v1.2.3