stabbish

:)
git clone https://git.sr.ht/~ashymad/stabbish
Log | Files | Refs | README | LICENSE

utils.h (1509B)


      1 #pragma once
      2 
      3 #include <errno.h>
      4 #include <stdio.h>
      5 #include <string.h>
      6 
      7 typedef int fd;
      8 typedef const char *string;
      9 
     10 _Thread_local static int __try_tmp_int;
     11 _Thread_local static long __try_tmp_long;
     12 
     13 #define shift(n)                                                               \
     14   if (n < argc) {                                                              \
     15     argv[n] = argv[0];                                                         \
     16     argv = &argv[n];                                                           \
     17     argc -= n;                                                                 \
     18   }
     19 
     20 #define tsizeof(table) sizeof(table) / sizeof(table[0])
     21 
     22 #define append_type(A, X) _Generic((X), int: A##_int, long: A##_long)
     23 
     24 #define get_1st_arg(arg1, ...) arg1
     25 
     26 #define default_arg(VAL, ...) get_1st_arg(__VA_ARGS__ __VA_OPT__(, ) VAL)
     27 
     28 #define try(cmd, ...)                                                          \
     29   (append_type(__try_tmp, cmd) = cmd);                                         \
     30   if (append_type(__try_tmp, cmd) default_arg(== -1, ##__VA_ARGS__)) {         \
     31     fprintf(stderr, "%s:%i: %s: %s\n", __FILE__, __LINE__, #cmd,               \
     32             strerror(errno));                                                  \
     33     return try_return;                                                         \
     34   }
     35 
     36 struct stdstream {
     37   fd in;
     38   fd out;
     39   fd err;
     40 };
     41 
     42 char *pasprintf(string __restrict str, ...);
     43 int memexecv(fd exe, char **argv, char **envp, struct stdstream std);