Fortune for sink's current commit: Half blessing − 半吉args
parent
5d1daa98e4
commit
c64f3f7499
@ -0,0 +1,26 @@
|
||||
|
||||
#include "args.h"
|
||||
|
||||
const pargs_t* parsed_args = NULL;
|
||||
static const pargs_t default_args[1] = { A_DEFAULT_ARGS }; //A_DEFAULT_ARGS_P;
|
||||
|
||||
const pargs_t* a_get_program_args() {
|
||||
return parsed_args ?: default_args;
|
||||
}
|
||||
|
||||
bool a_is_parsed() { return parsed_args != NULL; }
|
||||
|
||||
enum arg_parse_result a_parse_into(pargs_t *restrict parsed, int *restrict argc, char** *restrict p_argv, char** *restrict p_envp)
|
||||
{
|
||||
//TODO
|
||||
return A_PF_UNKNOWN;
|
||||
}
|
||||
|
||||
enum arg_parse_result a_parse(int *restrict argc, char** *restrict p_argv, char** *restrict p_envp)
|
||||
{
|
||||
_Thread_local static pargs_t glob_parsed_args;
|
||||
enum arg_parse_result r = a_parse_into(&glob_parsed_args, argc, p_argv, p_envp);
|
||||
|
||||
if(!r) parsed_args = &glob_parsed_args; // A_P_OK
|
||||
return r;
|
||||
}
|
@ -0,0 +1,68 @@
|
||||
#ifndef _ARGS_H
|
||||
#define _ARGS_H
|
||||
#define _a_inline_proto __attribute__((__gnu_inline__, __always_inline__)) extern inline
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
enum arg_parse_result {
|
||||
A_PF_UNKNOWN = -1,
|
||||
A_P_OK = 0,
|
||||
|
||||
// TODO: specific errors...
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
struct {
|
||||
bool in,out,err;
|
||||
} replace; // { 1, 1, 0 }
|
||||
|
||||
const char* target; // NULL -> default "/dev/null"
|
||||
|
||||
struct {
|
||||
/*struct _Alignas(uint64_t) {
|
||||
int64_t n : 63;
|
||||
bool all : 1;
|
||||
} __attribute__((packed, aligned(uint64_t)));*/
|
||||
size_t n;
|
||||
|
||||
int fds[];
|
||||
}* restrict fd_pass; // A_FD_PASS_NONE
|
||||
|
||||
} pargs_t;
|
||||
|
||||
#define A_FD_PASS_ALL ((void*)(~((uintptr_t)0ul)))
|
||||
#define A_FD_PASS_NONE NULL
|
||||
|
||||
#define A_DEFAULT_ARGS ((pargs_t){ { true, true, false}, NULL, A_FD_PASS_NONE })
|
||||
#define A_DEFAULT_ARGS_P ((pargs_t[1]) { A_DEFAULT_ARGS } )
|
||||
|
||||
extern const pargs_t* parsed_args;
|
||||
|
||||
/// Return parsed args or default args if no parsed args have been set.
|
||||
_a_inline_proto const pargs_t* a_get_program_args()
|
||||
{
|
||||
__attribute__((section(".text#"))) // Does this give any actual benefit?
|
||||
static const pargs_t default_args = A_DEFAULT_ARGS;
|
||||
|
||||
return parsed_args ?: &default_args;//A_DEFAULT_ARGS_P;
|
||||
}
|
||||
|
||||
/// Have the program's arguments been parsed?
|
||||
_a_inline_proto bool a_is_parsed()
|
||||
{ return parsed_args != NULL; }
|
||||
|
||||
enum arg_parse_result a_parse_into(pargs_t *restrict parsed, int *restrict argc, char** *restrict p_argv, char** *restrict p_envp);
|
||||
|
||||
_a_inline_proto // TODO: XXX: Is this worth it?
|
||||
enum arg_parse_result a_parse(int *restrict argc, char** *restrict p_argv, char** *restrict p_envp)
|
||||
{
|
||||
static pargs_t glob_parsed_args; //XXX: Wth is this an error?
|
||||
enum arg_parse_result r = a_parse_into(&glob_parsed_args, argc, p_argv, p_envp);
|
||||
|
||||
if(!r) parsed_args = &glob_parsed_args; // A_P_OK
|
||||
return r;
|
||||
}
|
||||
#undef _a_inline_proto
|
||||
#endif /* _ARGS_H */
|
Loading…
Reference in new issue