-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCommandLineArg.c
More file actions
86 lines (74 loc) · 2.09 KB
/
CommandLineArg.c
File metadata and controls
86 lines (74 loc) · 2.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include "CommandLineArg.h"
#include <SSC/SSC_String.h>
#define R_ SSC_RESTRICT
#define PROC_(name) int name##_argproc(const int argc, char** R_ argv, const int off, void* R_ v)
#define CTX_ ((Threegen*)v)
#ifdef THREEGEN_EXTERN_STRICT_ARG_PROCESSING
#define HANDLE_INVALID_ARG_(arg) SSC_errx("Error: Invalid argument (%s)\n", arg)
#else
#define HANDLE_INVALID_ARG_(arg) /* Nil */
#endif
PROC_(all)
{
CTX_->flags |= (THREEGEN_USE_LCASE | THREEGEN_USE_UCASE | THREEGEN_USE_SYMBOLS | THREEGEN_USE_DIGITS);
return SSC_1opt(argv[0][off]);
}
PROC_(digit)
{
CTX_->flags |= THREEGEN_USE_DIGITS;
return SSC_1opt(argv[0][off]);
}
PROC_(entropy)
{
CTX_->flags |= THREEGEN_GET_ENTROPY;
return SSC_1opt(argv[0][off]);
}
PROC_(format)
{
CTX_->flags |= THREEGEN_USE_FORMATTING;
return SSC_1opt(argv[0][off]);
}
PROC_(help)
{
print_help();
exit(EXIT_SUCCESS);
return 0;
}
PROC_(lower)
{
CTX_->flags |= THREEGEN_USE_LCASE;
return SSC_1opt(argv[0][off]);
}
#define ERR_MIN_PW_SIZE_PROMPT_ "Error: Minimum password size is 1 character.\n"
#define ERR_MAX_PW_SIZE_PROMPT_ "Error: Maximum password size is " SSC_STRINGIFY(THREEGEN_MAX_PW_SIZE) " characters.\n"
PROC_(password_size)
{
SSC_ArgParser ap;
SSC_ArgParser_init(&ap, argv[0], argc, argv);
if (ap.to_read) {
SSC_assertMsg((ap.size >= 1), ERR_MIN_PW_SIZE_PROMPT_);
SSC_assertMsg((ap.size <= 3), ERR_MAX_PW_SIZE_PROMPT_);
char* const tmp = (char*)SSC_mallocOrDie(ap.size + 1);
memcpy(tmp, ap.to_read, ap.size + 1);
int n_digits = SSC_Cstr_shiftDigitsToFront(tmp, ap.size);
SSC_assertMsg((n_digits >= 1), ERR_MIN_PW_SIZE_PROMPT_);
SSC_assertMsg((n_digits <= 3), ERR_MAX_PW_SIZE_PROMPT_);
int size = atoi(tmp);
SSC_assertMsg((size >= 1), ERR_MIN_PW_SIZE_PROMPT_);
SSC_assertMsg((size <= THREEGEN_MAX_PW_SIZE), ERR_MAX_PW_SIZE_PROMPT_);
CTX_->requested_pw_size = size;
free(tmp);
return ap.consumed;
}
return 0;
}
PROC_(symbol)
{
CTX_->flags |= THREEGEN_USE_SYMBOLS;
return SSC_1opt(argv[0][off]);
}
PROC_(upper)
{
CTX_->flags |= THREEGEN_USE_UCASE;
return SSC_1opt(argv[0][off]);
}