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);