author | Myhailo Danylenko <isbear@ukrpost.net> |
Sun, 24 Mar 2013 00:59:26 +0200 | |
changeset 84 | 6ff846816073 |
parent 82 | 06d4a9185902 |
permissions | -rw-r--r-- |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
1 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
2 |
**New commands interface for MCabber** |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
3 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
4 |
[[!toc levels=2]] |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
5 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
6 |
# Overview |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
7 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
8 |
New command interface was designed with next goals in mind: |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
9 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
10 |
* Share as much argument checking code as possible. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
11 |
* Remove cumbersome parsing code from commands. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
12 |
* Encourage adding options and switches to commands. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
13 |
* Use the same rules, when handling arguments everywhere. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
14 |
* Integrate and improve completion system. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
15 |
* Add common generic stuff, like '--help'. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
16 |
* Try to still be lightweight. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
17 |
* Try to still be readable. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
18 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
19 |
It is built around static structure, "command description". User can add or |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
20 |
remove these structures to list of commands. *FIXME* more |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
21 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
22 |
## Command description struct, 'cmdopts_t' |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
23 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
24 |
[[!format c """// -------------------------------------------------------------- |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
25 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
26 |
typedef struct cmdopts_struct cmdopts_t; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
27 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
28 |
typedef enum { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
29 |
cmd_default = 0x0000, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
30 |
cmd_safe = 0x0001, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
31 |
} cmd_flags_t; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
32 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
33 |
struct cmdopts_struct { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
34 |
const char *name; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
35 |
const cmd_flags_t flags; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
36 |
const cmd_checker_t check; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
37 |
const cmd_handler_t handle; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
38 |
const cmdopt_t *opts; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
39 |
const cmdarg_t *args; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
40 |
const cmdopts_t *cmds; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
41 |
const gpointer userdata; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
42 |
size_t valno; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
43 |
}; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
44 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
45 |
// -------------------------------------------------------------- """ ]] |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
46 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
47 |
This struct describes command as a whole and links to argument descriptions. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
48 |
This struct is also used to describe individual subcommands, as they are quite |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
49 |
similar to normal command, because they can have their own options, arguments |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
50 |
and subcommands. The fields of this struct: |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
51 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
52 |
* 'name' - name of the command or subcommand. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
53 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
54 |
* 'flags' - currently there's only one flag: |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
55 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
56 |
+ 'cmd_safe' - command is safe to execute in main mcabberrc during |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
57 |
initialization. Have no meaning for subcommands. |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
58 |
+ 'cmd_default' - default value of no flags enabled. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
59 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
60 |
* 'check' - execution environment checker for command. This callback is used |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
61 |
to do general checks before even parsing command line. You can write your |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
62 |
own checker or use standard ones, for example - 'cmd_check_online', that |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
63 |
checks, if you are currently online. |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
64 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
65 |
* 'handle' - command function. It is executed only if command line was |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
66 |
successfully parsed and argument values passed the type checking. Unused in |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
67 |
subcommands. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
68 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
69 |
* 'opts' - pointer to the array of 'cmdopt_t' structs, describing command-line |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
70 |
options ("-f bar") and switches ("-x"), that this command accepts. Array |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
71 |
must end with option, that have 0 as short option character. |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
72 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
73 |
* 'args' - similarly, pointer to the array of 'cmdarg_t' structs, that describe |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
74 |
command-line positional arguments (in order). Array must end with argument, |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
75 |
that have NULL name. |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
76 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
77 |
* 'cmds' - pointer to the array of subcommands of this command (or subcommand). |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
78 |
How parser switches to subcommands we will describe later. Array must end |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
79 |
with subcommand, that have NULL name. |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
80 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
81 |
* 'userdata' - arbitrary pointer, where you can put some data, that should |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
82 |
accompany this command or subcommand. Unused by parser. |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
83 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
84 |
* 'valno' - this is internal value, that is initialized at command definition |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
85 |
time, you should not modify it. Currently unused in subcommands. |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
86 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
87 |
## Command function, 'cmd_handler_t' |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
88 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
89 |
[[!format c """// -------------------------------------------------------------- |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
90 |
|
82
06d4a9185902
[cmdopts] Fix documentation errors
Myhailo Danylenko <isbear@ukrpost.net>
parents:
81
diff
changeset
|
91 |
typedef gchar *(*cmd_handler_t) (const cmdopts_t *command, |
06d4a9185902
[cmdopts] Fix documentation errors
Myhailo Danylenko <isbear@ukrpost.net>
parents:
81
diff
changeset
|
92 |
cmdarg_value_t *values); |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
93 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
94 |
// -------------------------------------------------------------- """ ]] |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
95 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
96 |
Command function is passed it's command definition struct (mainly to give it |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
97 |
access to userdata) and dynamically allocated array of parsed argument values. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
98 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
99 |
It should return NULL in case all went smoothly, or dynamically allocated error |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
100 |
string, that will be g_free()'d after displaying. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
101 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
102 |
So, as you can see, command definition should give parser info on what can |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
103 |
appear in command line and how to map all these options and arguments to array |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
104 |
of values. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
105 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
106 |
## Option description struct, 'cmdopt_t' |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
107 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
108 |
[[!format c """// -------------------------------------------------------------- |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
109 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
110 |
typedef struct { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
111 |
const char stortopt; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
112 |
const char *longopt; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
113 |
cmdarg_t arg; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
114 |
} cmdopt_t; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
115 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
116 |
// -------------------------------------------------------------- """ ]] |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
117 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
118 |
This struct just adds short option character and long option name to generic |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
119 |
argument struct, that we'll look at right now. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
120 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
121 |
## Argument description struct, 'cmdarg_t' |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
122 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
123 |
[[!format c """// -------------------------------------------------------------- |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
124 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
125 |
typedef struct cmdarg_struct cmdarg_t; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
126 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
127 |
typedef enum { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
128 |
cmdarg_default = 0x0000, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
129 |
cmdarg_catchall = 0x0001, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
130 |
cmdarg_plain = 0x0002, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
131 |
cmdarg_check = 0x0004, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
132 |
cmdarg_required = 0x0008, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
133 |
cmdarg_subcmd = 0x0010, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
134 |
cmdarg_switch = 0x0020, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
135 |
cmdarg_eol = 0x0003, // catchall + plain |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
136 |
cmdarg_chreq = 0x000C, // check + required |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
137 |
cmdarg_special = 0x0030, // subcmd + switch |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
138 |
cmdarg_trigger = 0x0024, // switch + check |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
139 |
} cmdarg_flags_t; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
140 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
141 |
struct cmdarg_struct { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
142 |
const char *name; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
143 |
const guint pos; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
144 |
const cmdarg_flags_t flags; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
145 |
const char *defval; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
146 |
const cmdarg_type *type; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
147 |
gconstpointer chkdata; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
148 |
gconstpointer userdata; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
149 |
}; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
150 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
151 |
// -------------------------------------------------------------- """ ]] |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
152 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
153 |
This struct stores information about mapping between command-line entity |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
154 |
(switch, option, argument, subcommand) and element in 'values' array. First, |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
155 |
let's briefly describe fields, and then walk through their use in different |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
156 |
entities. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
157 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
158 |
Fields: |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
159 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
160 |
* 'name' - argument name, mainly used for help (not implemented yet) and error |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
161 |
messages. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
162 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
163 |
* 'pos' - this is the index in 'values' array, where argument value should be |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
164 |
stored. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
165 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
166 |
* 'flags' - various tweaks to parsing process: |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
167 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
168 |
+ 'catchall' - argument value will catch everything, remaining on command |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
169 |
line, even if unescaped spaces will appear in it. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
170 |
+ 'plain' - do not treat backslashes ('\') and quotes ('"') as escaping |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
171 |
characters. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
172 |
+ 'check' - call argument value checker (defined in 'type' field), even if |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
173 |
argument was not assigned the value during the parsing process. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
174 |
+ 'required' - if mentioned checker will return error, with this flag set, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
175 |
this error will be considered fatal, and command function will not be |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
176 |
called. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
177 |
+ 'subcmd' - this argument is subcommand. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
178 |
+ 'switch' - this argument is part of option definition, and this option |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
179 |
have no argument (but it still needs to store switch state somewhere). |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
180 |
+ 'eol' - shortcut for "rest of command line without modification". |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
181 |
+ 'chreq' - shortcut for "argument must have a valid value". |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
182 |
+ 'special' - this is special type of argument - subcommand or switch. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
183 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
184 |
* 'defval' - default value for argument in "unchecked" form - i.e., in the form |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
185 |
of string, as it appears on command line (we'll discuss type checkers and |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
186 |
what can they do to value later). Before parsing command line, parser will |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
187 |
assign this value to corresponding value structure. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
188 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
189 |
* 'type' - pointer to structure, describing argument type. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
190 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
191 |
* 'chkdata' - if type needs some additional info, it is a place to supply it. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
192 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
193 |
* 'userdata' - place for arbitrary info, that should accompany this argument or |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
194 |
option. Unused by parser. |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
195 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
196 |
Now, let's discuss general case - option with argument or positional argument. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
197 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
198 |
When parser encounters such argument, it checks 'catchall' and 'plain' flags and |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
199 |
crops argument value from command line accordingly, then it assigns it to the |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
200 |
'value.arg' field of 'cmdarg_value_t' struct in array 'values' with index, given |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
201 |
in 'pos'. Also it marks such value as 'visited' and puts a link to argument |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
202 |
description into value's 'src' field. More about effect of these actions later, |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
203 |
in 'cmdarg_value_t' section. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
204 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
205 |
However, if argument struct is a part of option description struct, and have |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
206 |
flag 'switch' set, parser will not try to parse value. Instead it will increase |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
207 |
the count in 'value.swc' in corresponding 'cmdarg_value_t' struct. Argument |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
208 |
name for switches is essentially ignored, but for safety sake it is recommended |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
209 |
to duplicate switch long option name here. Flags 'catchall' and 'plain' |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
210 |
obviously have no effect. Flag 'check' makes switch a trigger, that flips |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
211 |
between 'on' and 'off' for every occurence of flag on command line. Flags |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
212 |
'required' and 'subcmd' also have no effect for obvious reasons. Default value |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
213 |
is ignored for switches, they always start with count 0 (off). Since switch is |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
214 |
internal type, argument type field is ignored as well. Flags and source fields |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
215 |
of value are updated as usual. |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
216 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
217 |
If flag 'subcmd' is set for positional argument, parser crops argument value |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
218 |
according to flags as usual, but instead of assigning it, walks through list of |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
219 |
subcommands in command description struct and compares obtained value to |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
220 |
subcommand names. If it finds corresponding subcommand, it assigns pointer to |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
221 |
subcommand description struct to 'value.cmd' field of corresponding |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
222 |
'cmdarg_value_t' struct and updates it's source and flags. Then, instead of |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
223 |
proceeding with parsing process, it recursively calls parser on remaining part |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
224 |
of command line, passing subparser subcommand description. Note, that if |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
225 |
subcommand parser will end parsing before hitting end of command line, parser |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
226 |
will proceed with parsing arguments for main command. Default value and |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
227 |
argument type fields are ignored for subcommands. |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
228 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
229 |
Now let's take a look at value structure, that you'll be dealing with the most |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
230 |
in the actual code. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
231 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
232 |
## Argument value structure, 'cmdarg_value_t' |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
233 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
234 |
[[!format c """// -------------------------------------------------------------- |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
235 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
236 |
typedef struct cmdarg_value_struct cmdarg_value_t; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
237 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
238 |
typedef enum { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
239 |
cmdval_default = 0x0000, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
240 |
cmdval_visited = 0x0100, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
241 |
cmdval_freeme = 0x0200, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
242 |
} cmdval_flags_t; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
243 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
244 |
struct cmdarg_value_struct { |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
245 |
const cmdarg_t *src; |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
246 |
cmdval_flags_t flags; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
247 |
union { |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
248 |
guint uint; |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
249 |
gint sint; |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
250 |
guint swc; |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
251 |
const gchar *roarg; |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
252 |
gchar *arg; |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
253 |
const cmdopts_t *cmd; |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
254 |
struct { |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
255 |
gpointer bud; |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
256 |
gchar *resource; |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
257 |
} rjid; |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
258 |
gpointer ptr; |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
259 |
} value; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
260 |
}; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
261 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
262 |
// -------------------------------------------------------------- """ ]] |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
263 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
264 |
Command may happen to be called recursively - i.e., something in command may |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
265 |
cause the event, that will cause another call to the same command, thus we |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
266 |
cannot store actual values in command/argument definition struct, and have to |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
267 |
allocate dynamic memory for them. This struct is designed exactly for this. |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
268 |
Let's take a look at it's fields: |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
269 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
270 |
* 'src' - this points to the argument description, from which this struct is |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
271 |
holding value right now (note, that value can be initialized several times |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
272 |
during parsing process from different arguments). |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
273 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
274 |
* 'flags' - to hold parser and typechecker marks: |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
275 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
276 |
+ 'visited' - parser uses this to track values, initialized from command |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
277 |
line as opposed to values, holding default value. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
278 |
+ 'freeme' - used by argument type checker to tell parser, that it needs to |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
279 |
call value destructor callback on value. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
280 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
281 |
* 'value' - union, that contains various possible forms of value: |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
282 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
283 |
+ 'uint' - generic unsigned integer. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
284 |
+ 'sint' - generic signed integer. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
285 |
+ 'swc' - switch occurence count. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
286 |
+ 'roarg' - XXX read-only string - default value or like. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
287 |
+ 'arg' - generic string value (read-write). |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
288 |
+ 'cmd' - pointer to subcommand description struct. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
289 |
+ 'rjid' - roster jid value - pair of roster buddy and resource string. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
290 |
+ 'ptr' - used for anything, that does not fits into these types. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
291 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
292 |
To better understand, how these fields are used, let's walk through parsing |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
293 |
process. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
294 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
295 |
## Parsing |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
296 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
297 |
Parser starts by allocating memory for values array, and then initializing it by |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
298 |
walking through command description, looking at options and arguments and |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
299 |
assigning default values to corresponding entries in array. It also puts |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
300 |
pointer to the argument description into value's 'src' field. Thus, all used in |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
301 |
command description values will have this field initialized, even if they were |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
302 |
not specified on command line. This comes handly later, when checking for |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
303 |
reqired value presence. For switches parser just sets the counter to zero. |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
304 |
Note, that parser does not descend into subcommands at this stage. It does the |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
305 |
same procedure for subcommand, but later, when it already knows which subcommand |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
306 |
is selected. Also note, that if several arguments have the same value index, |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
307 |
parser will use latest encountered one to initialize the value. This is used |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
308 |
for default value in "argument clustering", that I'll show you later. |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
309 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
310 |
Then parser calls command environment checker callback (if present), and if it |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
311 |
returns error - terminates the process right now. Note, that subcommands can |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
312 |
also have checkers. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
313 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
314 |
Next parser does its job of parsing command line. Each time it extracts |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
315 |
argument value, it into 'value.arg' field of corresponding value entry and |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
316 |
pointer to argument description struct into 'src' field. Also it sets 'visited' |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
317 |
flag on value. At this stage value is still just unchecked string, except for |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
318 |
special argument types. For switch occurence count in 'value.swc' gets |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
319 |
increased each time argument was specified. Note however, that if several |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
320 |
switches use the same value index ("clustered switches"), counter gets reset, |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
321 |
when switches change one another in sequence - i.e. "-e -s -s -s" will count as |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
322 |
three "-s", but "-s -s -e -s" will count as only one "-s". For subcommands |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
323 |
parser checks for corresponding subcommand in 'cmds' list, assigns it to |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
324 |
'value.cmd' and recursively passes the end of command line to be parsed with |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
325 |
subcommand description. Note, that for subcommands parser does "checking on the |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
326 |
spot" - if parsed argument value does not match any subcommand, and argument |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
327 |
have 'required' flag set, it raises error immediately (if flag is not set, it |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
328 |
merely assigns NULL and proceeds parsing according to current command |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
329 |
description). |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
330 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
331 |
Then parser walks through array of values and performs value checking. Note, |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
332 |
that all values, that need checking at this point should have 'src' field |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
333 |
initialized - either set at default value assignment step, or during parsing, |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
334 |
so, parser knows properties of value's argument. Parser only pays attention to |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
335 |
the values, that either have 'visited' flag set (i.e. provided by user) or that |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
336 |
have 'check' flag in argument description (useful for mandatory arguments or |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
337 |
default values, that need convesion). If value corresponds to a switch, and |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
338 |
argument have 'check' flag set, switch occurence count is replaced by remainder |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
339 |
of division it by 2 (this way switch behaves like trigger). If it is a |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
340 |
subcommand, and it have 'required' flag set, parser checks, if it have non-NULL |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
341 |
value. If it is usual argument (option or positional), and it does have 'type', |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
342 |
that have 'check' callback set, parser calls this checker, passing it value |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
343 |
structure (again, value structure contains pointer to argument description, so, |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
344 |
checker can access 'chkdata' field, supplied by user). If checker returns error |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
345 |
string and argument have 'required' flag set, parser raises error. If flag is |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
346 |
not set, parser just prints warning and proceeds with checking. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
347 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
348 |
If checking was successful, parser calls command function, providing it with |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
349 |
command description and values array. This function can also return error, but |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
350 |
at this stage it does not change process, only causes error message to be |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
351 |
printed. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
352 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
353 |
And finally parser frees allocated resources - walks through values array, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
354 |
calling argument type 'free' callback on values, that have 'freeme' flag set and |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
355 |
then frees the array itself. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
356 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
357 |
## Argument type, 'cmdarg_type_t' |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
358 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
359 |
[[!format c """// -------------------------------------------------------------- |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
360 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
361 |
typedef struct cmdarg_type_struct cmdarg_type_t; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
362 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
363 |
typedef gchar *(*cmdarg_checker_t) (cmdarg_value_t *value); |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
364 |
typedef void (*cmdarg_destructor_t) (cmdarg_value_t *value); |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
365 |
// FIXME: this one is still not designed |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
366 |
typedef void (*cmdarg_completor_t) (void); |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
367 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
368 |
struct cmdarg_type_struct { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
369 |
cmdarg_checker_t check; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
370 |
cmdarg_destructor_t free; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
371 |
cmdarg_completor_t complete; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
372 |
}; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
373 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
374 |
// -------------------------------------------------------------- """ ]] |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
375 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
376 |
As you can see, argument type is nothing more than a set of callbacks: |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
377 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
378 |
* 'check' - check parsed argument value for conformance to type rules, possibly |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
379 |
replace with something different, like corresponding integer value or roster |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
380 |
buddy pointer. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
381 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
382 |
* 'free' - if type checker may need to free some data afterwards, this callback |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
383 |
should be set to corresponding function, and each time checker really needs |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
384 |
value to be freed, it should set flag 'freeme' on value. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
385 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
386 |
* 'complete' - *FIXME* not yet designed callback, that will return list of |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
387 |
possible completions according to given prefix. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
388 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
389 |
After parsing command line parser performs argument value checking, that's where |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
390 |
it calls 'check' callbacks. Checker is given pointer to value structure, that |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
391 |
it needs to check. Checker can modify value string (except when it is default |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
392 |
value, but you have to supply your default values so, that they do not need |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
393 |
modifying) or completely replace it with another string or even non-string |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
394 |
object. If checker uses some resources (eg. allocates memory for replacement |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
395 |
value), it can set the flag 'freeme' on value to request call to value |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
396 |
destructor, when values array will be freed. If checker needs some additional |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
397 |
data (eg. it is some generic checker, that needs list of valid values or other |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
398 |
parameters), these data can be supplied in 'chkdata' field. Checker function |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
399 |
should return NULL on success or error string, that will be g_free()'d by |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
400 |
parser. Take note, that if argument does not have 'reqired' flag set, parser |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
401 |
will ignore checker error, so, it is recommended to nullify invalid value before |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
402 |
returning error (but it is not required). |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
403 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
404 |
# Examples |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
405 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
406 |
When writing description for a command, first thing, you have to do - is to |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
407 |
determine, which values your command can get from user. You don't have to be |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
408 |
shy - new interface is designed to encourage commands to be as flexible and |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
409 |
option-rich as possible. |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
410 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
411 |
Second - consider, which ones are to be specified as positional arguments, and |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
412 |
which should become options or switches. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
413 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
414 |
Next you will want to decide, which checks and restrictions should you put on |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
415 |
values. Essentially, determine value type. |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
416 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
417 |
And then you can begin writing command definition. So, let's start with |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
418 |
something simple. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
419 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
420 |
## Single-argument no-checks command |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
421 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
422 |
Let's look at command like /say, that have only one argument, that should be |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
423 |
passed as is, and with no restrictions: |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
424 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
425 |
/ex1 message... |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
426 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
427 |
Definition for such command will look like: |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
428 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
429 |
[[!format c """// -------------------------------------------------------------- |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
430 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
431 |
// command function predeclaration |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
432 |
gchar *do_ex1 (const cmdopts_t *command, cmdarg_value_t *values); |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
433 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
434 |
// command arguments definition |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
435 |
cmdopts_t def_ex1 = { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
436 |
"ex1", // command name |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
437 |
cmd_default, // flags |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
438 |
NULL, // checker |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
439 |
do_ex1, // command function |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
440 |
NULL, // list of options - none |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
441 |
(cmdarg_t[2]){ // list of arguments |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
442 |
{ |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
443 |
"message", // argument name |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
444 |
0, // value index |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
445 |
// flags: |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
446 |
// - plain: do not interpret quotes and escapes |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
447 |
// - catchall: do not end argument on unescaped spaces |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
448 |
cmdarg_plain | cmdarg_catchall, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
449 |
NULL, // default value |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
450 |
NULL, // argument type |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
451 |
}, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
452 |
{NULL} // this is an argument list end marker |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
453 |
}, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
454 |
NULL, // list of subcommands - none |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
455 |
}; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
456 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
457 |
// Command function gets shown above command description (we don't need it) and |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
458 |
// argument value list. Returns error message or NULL. |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
459 |
gchar *do_ex1 (const cmdopts_t *command, cmdarg_value_t *values) |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
460 |
{ |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
461 |
gchar *message = values[0].value.arg; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
462 |
// now do something with message: |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
463 |
// - check, if message was given at all |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
464 |
if (!message || !*message) |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
465 |
// return error, it will be printed, prepended by command name |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
466 |
return g_strdup("You need to specify a message!"); |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
467 |
// - use the value |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
468 |
scr_log_print (LPRINT_NORMAL, "Got the message: \"%s\".", message); |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
469 |
// no error occured |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
470 |
return NULL; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
471 |
} |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
472 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
473 |
... |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
474 |
// register our command |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
475 |
cmd_define (&def_ex1); |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
476 |
... |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
477 |
// remove command |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
478 |
cmd_undef (&def_ex1); |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
479 |
... |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
480 |
|
82
06d4a9185902
[cmdopts] Fix documentation errors
Myhailo Danylenko <isbear@ukrpost.net>
parents:
81
diff
changeset
|
481 |
// -------------------------------------------------------------- """ ]] |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
482 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
483 |
A lot of things to do to achieve a simple goal - does not look quite appealing |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
484 |
so far. Still, let's tweak our example a bit. |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
485 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
486 |
Remember the third step - decide, which checks should apply to our argument. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
487 |
Now, look at our command - we check, if message is NULL or if message is empty. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
488 |
But imagine, that user has given us a message " " - it's of no big use to us, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
489 |
so, probably, we should also strip leading/trailing spaces before doing the |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
490 |
check. That's where argument types come into play. We can write argument |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
491 |
checker for that! But luckily, we already have built-in standard checker, that |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
492 |
does exactly what we need - checks if string contains non-space characters. All |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
493 |
we need to do - to specify '&cmdarg_type_nonspace' as argument type and remove |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
494 |
our check inside of the command: |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
495 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
496 |
[[!format c """// -------------------------------------------------------------- |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
497 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
498 |
... |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
499 |
cmdopts_t def_ex1 = { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
500 |
"ex1", |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
501 |
cmd_default, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
502 |
NULL, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
503 |
do_ex1, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
504 |
NULL, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
505 |
(cmdarg_t[2]){ |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
506 |
{ |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
507 |
"message", |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
508 |
0, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
509 |
// flags: |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
510 |
// - plain: do not interpret quotes and escapes |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
511 |
// - catchall: do not end argument on unescaped spaces |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
512 |
// - check: always invoke checker, even if user omitted the argument |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
513 |
// - required: terminate processing, if checker returns error |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
514 |
// a lot of flags, but we can use shortcuts: |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
515 |
// - eol = plain + catchall: get everything to the end of line as is |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
516 |
// - chreq = check + required: argument needs to have a valid value |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
517 |
cmdarg_eol | cmdarg_chreq, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
518 |
NULL, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
519 |
// strip spaces, check if result have non-zero length |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
520 |
&cmdarg_type_nonspace, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
521 |
}, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
522 |
{NULL} |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
523 |
}, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
524 |
NULL, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
525 |
}; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
526 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
527 |
gchar *do_ex1 (const cmdopts_t *command, cmdarg_value_t *values) |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
528 |
{ |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
529 |
scr_log_print (LPRINT_NORMAL, "Got the message: \"%s\".", |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
530 |
values[0].value.arg); |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
531 |
return NULL; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
532 |
} |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
533 |
... |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
534 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
535 |
// -------------------------------------------------------------- """ ]] |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
536 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
537 |
Ok, that's a little bit better. Now let's move on to something more complex. |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
538 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
539 |
## Switches |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
540 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
541 |
Let's add switches '-s' and '-l', that will define, where to print the message |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
542 |
to - to log or to screen. For that we will need another two value indices - one |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
543 |
for each switch. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
544 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
545 |
[[!format c """// -------------------------------------------------------------- |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
546 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
547 |
... |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
548 |
cmdopts_t def_ex1 = { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
549 |
"ex1", |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
550 |
cmd_default, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
551 |
NULL, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
552 |
do_ex1, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
553 |
(cmdopt_t[3]){ |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
554 |
{ // first switch: [-s|--screen] |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
555 |
's', // short option name |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
556 |
"screen", // long option name |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
557 |
{ |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
558 |
"screen", // argument name - unused |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
559 |
1, // value position |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
560 |
// flags: |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
561 |
// - switch: this is switch |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
562 |
cmdarg_switch, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
563 |
NULL, // default value - unused |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
564 |
NULL, // type - unused |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
565 |
} |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
566 |
}, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
567 |
// second switch: [-l|--log] |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
568 |
{ 'l', "log", { "log", 2, cmdarg_switch, NULL, NULL } }, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
569 |
{0} // end of list marker |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
570 |
}, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
571 |
(cmdarg_t[2]){ |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
572 |
{ "message", 0, cmdarg_eol | cmdarg_chreq, NULL, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
573 |
&cmdarg_type_nonspace }, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
574 |
{NULL} |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
575 |
}, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
576 |
NULL, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
577 |
}; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
578 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
579 |
gchar *do_ex1 (const cmdopts_t *command, cmdarg_value_t *values) |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
580 |
{ |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
581 |
// default value |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
582 |
guint whereto = LPRINT_NORMAL; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
583 |
// -s is default, so, check, that it is not set before checking for -l |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
584 |
if (!values[1].value.swc) |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
585 |
if (values[2].value.swc) |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
586 |
whereto = LPRINT_LOG; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
587 |
scr_log_print (whereto, "Got the message: \"%s\".", values[0].value.arg); |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
588 |
return NULL; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
589 |
} |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
590 |
... |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
591 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
592 |
// -------------------------------------------------------------- """ ]] |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
593 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
594 |
Ok, that works, but what if user have aliases, and wants last specified option |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
595 |
to override the value? Currently, if -s was once specified, -l will not have any |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
596 |
effect, regardless of count or position in command line. Not that good. Let's |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
597 |
use the trick, that I call "argument clustering". We'll specify the same value |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
598 |
index for both switches. Since 'value' struct have the pointer to the argument, |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
599 |
it was initialized from last time, we can recognize, which switch was used last. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
600 |
By default this pointer points to the last argument with this index in command |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
601 |
definition - we can use that to specify default value. Now, to identify |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
602 |
switches we can use argument names, but 'argument' struct contains userdata |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
603 |
field, where we can put our LPRINT_* constants and just use it directly. So, |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
604 |
with clustered switches, we will have: |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
605 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
606 |
[[!format c """// -------------------------------------------------------------- |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
607 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
608 |
... |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
609 |
cmdopts_t def_ex1 = { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
610 |
"ex1", |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
611 |
cmd_default, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
612 |
NULL, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
613 |
do_ex1, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
614 |
(cmdopt_t[3]){ |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
615 |
// Set both argument indices to 1, specify our constants in userdata |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
616 |
// field. Screen is default value, thus, it goes last. |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
617 |
{ 'l', "log", { "log", 1, cmdarg_switch, NULL, NULL, NULL, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
618 |
(gpointer)LPRINT_LOG } }, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
619 |
{ 's', "screen", { "screen", 1, cmdarg_switch, NULL, NULL, NULL, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
620 |
(gpointer)LPRINT_NORMAL } }, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
621 |
{0} |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
622 |
}, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
623 |
(cmdarg_t[2]){ |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
624 |
{ "message", 0, cmdarg_eol | cmdarg_chreq, NULL, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
625 |
&cmdarg_type_nonspace }, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
626 |
{NULL} |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
627 |
}, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
628 |
NULL, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
629 |
}; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
630 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
631 |
gchar *do_ex1 (const cmdopts_t *command, cmdarg_value_t *values) |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
632 |
{ |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
633 |
scr_log_print ((guint)values[1].src -> userdata, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
634 |
"Got the message: \"%s\".", values[0].value.arg); |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
635 |
return NULL; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
636 |
} |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
637 |
... |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
638 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
639 |
// -------------------------------------------------------------- """ ]] |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
640 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
641 |
That's much better. This trick may be quite useful not only with switches, but |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
642 |
also with options, sometimes even clustering options with arguments can be |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
643 |
handy. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
644 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
645 |
## Options |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
646 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
647 |
Options are not much different from normal arguments, except there you'll see |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
648 |
'check' and 'required' mostly only in combination with default value - otherwise |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
649 |
it defeats the purpose - to be optional. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
650 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
651 |
[[!format c """// -------------------------------------------------------------- |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
652 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
653 |
// TODO: |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
654 |
// example (not really used as of now - were too complex to deal using old |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
655 |
// interface). |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
656 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
657 |
// -------------------------------------------------------------- """ ]] |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
658 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
659 |
## Subcommands |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
660 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
661 |
Now, let's discuss another internal argument type - subcommand. Since |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
662 |
subcommands are quite common in mcabber, and since they have quite big impact on |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
663 |
parsing process, they were made a part of parser. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
664 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
665 |
Currently, only positional arguments can be subcommands. You can have options or |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
666 |
other arguments precede them, though in practice there's no examples of that so |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
667 |
far. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
668 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
669 |
So, to indicate, that argument is a subcommand, you just add flag 'subcmd'. |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
670 |
When parser will encounter such argument, it will look up command structure with |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
671 |
specified name in the list 'cmds' of command definition and proceed parsing, |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
672 |
using that command definition instead of main one. A good example of command |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
673 |
with several completely different subcommands would be '/color', so, let's look: |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
674 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
675 |
[[!format c """// -------------------------------------------------------------- |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
676 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
677 |
static gchar *do_color (const cmdopts_t *command, cmdarg_value_t *values); |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
678 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
679 |
// We will put these values in subcommand definition 'userdata' fields |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
680 |
// to simplify the task of determining, which subcommand was actually selected. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
681 |
typedef enum { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
682 |
scmd_color_roster, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
683 |
scmd_color_mucnick, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
684 |
scmd_color_muc, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
685 |
} scmd_color_t; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
686 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
687 |
// We define value inedxes as enum to make value access expressions |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
688 |
// self-explanatory. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
689 |
typedef enum { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
690 |
pos_color_scmd = 0, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
691 |
pos_color_roster_status = 1, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
692 |
pos_color_roster_jid = 2, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
693 |
pos_color_roster_color = 3, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
694 |
pos_color_muc_room = 1, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
695 |
pos_color_muc_mode = 2, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
696 |
pos_color_nick_nick = 1, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
697 |
pos_color_nick_color = 2, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
698 |
} pos_color_t; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
699 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
700 |
// This is a helper struct for cmdarg_type_string2enum checker. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
701 |
// The checker will compare value to strings and replace value.arg |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
702 |
// with corresponding value.uint. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
703 |
static const string2enum_t s2e_color_muc[] = { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
704 |
{ "on", MC_ALL }, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
705 |
{ "off", MC_OFF }, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
706 |
{ "preset", MC_PRESET }, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
707 |
{ "-", MC_REMOVE }, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
708 |
{ NULL, 0 }, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
709 |
}; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
710 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
711 |
static cmdopts_t def_color = { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
712 |
"color", |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
713 |
// This command is allowed in main config file during initialization, thus |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
714 |
// it have the 'safe' flag. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
715 |
cmd_safe, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
716 |
NULL, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
717 |
do_color, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
718 |
// no options |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
719 |
NULL, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
720 |
// only one argument - subcommand |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
721 |
(cmdarg_t[2]){{ "subcommand", pos_color_scmd, cmdarg_subcmd | cmdarg_chreq, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
722 |
NULL, NULL },{NULL}}, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
723 |
// three subcommands |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
724 |
(cmdopts_t[4]){ |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
725 |
// First subcommand - 'roster' with three arguments. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
726 |
{"roster", cmd_default, NULL, NULL, NULL, (cmdarg_t[4]){ |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
727 |
{ "statusmask|clear", pos_color_roster_status, cmdarg_chreq, NULL, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
728 |
&cmdarg_type_color_statusmask, (gpointer)"ofdna_?" }, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
729 |
{ "jidmask", pos_color_roster_jid, cmdarg_check, NULL, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
730 |
&cmdarg_type_bjidmask }, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
731 |
{ "color|-", pos_color_roster_color, cmdarg_check, NULL, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
732 |
&cmdarg_type_color }, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
733 |
{NULL} |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
734 |
}, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
735 |
// Subcommand can have its own subcommands, but in this case we |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
736 |
// don't have them. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
737 |
NULL, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
738 |
// We use userdata to determine, which subcommand was selected. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
739 |
(gpointer)scmd_color_roster}, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
740 |
// Second subcommand - 'muc' with two arguments. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
741 |
{"muc", cmd_default, NULL, NULL, NULL, (cmdarg_t[3]){ |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
742 |
{ "roomjid", pos_color_muc_room, cmdarg_chreq, NULL, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
743 |
&cmdarg_type_color_roomjid }, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
744 |
{ "on|off|preset|-", pos_color_muc_mode, cmdarg_chreq, "on", |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
745 |
&cmdarg_type_string2enum, (gpointer)s2e_color_muc }, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
746 |
{NULL} |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
747 |
}, NULL, (gpointer)scmd_color_muc}, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
748 |
// Third subcommand - 'mucnick' also with two arguments. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
749 |
{"mucnick", cmd_default, NULL, NULL, NULL, (cmdarg_t[3]){ |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
750 |
{ "nick", pos_color_nick_nick, cmdarg_chreq, NULL, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
751 |
&cmdarg_type_nick }, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
752 |
{ "color|-", pos_color_nick_color, cmdarg_chreq, NULL, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
753 |
&cmdarg_type_color }, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
754 |
{NULL} |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
755 |
}, NULL, (gpointer)scmd_color_mucnick}, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
756 |
{NULL} |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
757 |
}, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
758 |
}; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
759 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
760 |
static gchar *do_color (const cmdopts_t *options, cmdarg_value_t *values) |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
761 |
{ |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
762 |
scmd_color_t subcmd = |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
763 |
(scmd_color_t) (values[pos_color_scmd].value.cmd -> userdata); |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
764 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
765 |
if (subcmd == scmd_color_roster) { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
766 |
const gchar *status = values[pos_color_roster_status].value.arg; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
767 |
const gchar *wildcard = values[pos_color_roster_jid].value.arg; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
768 |
const gchar *color = values[pos_color_roster_color].value.arg; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
769 |
if (!strcmp(status, "clear")) { // Not a color command, clear all |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
770 |
scr_roster_clear_color(); |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
771 |
update_roster = TRUE; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
772 |
} else { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
773 |
// Unfortunately, due to "clear" case not taking any arguments, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
774 |
// we cannot check for argument presence using 'required' flag. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
775 |
if ((!wildcard) || (!color)) { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
776 |
return g_strdup ("Missing argument."); |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
777 |
} else { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
778 |
update_roster = scr_roster_color(status, wildcard, color) || |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
779 |
update_roster; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
780 |
} |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
781 |
} |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
782 |
} else if (subcmd == scmd_color_muc) { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
783 |
scr_muc_color ( values[pos_color_muc_room].value.arg, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
784 |
values[pos_color_muc_mode].value.uint ); |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
785 |
} else { // scmd_color_mucnick |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
786 |
scr_muc_nick_color( values[pos_color_nick_nick].value.arg, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
787 |
values[pos_color_nick_color].value.arg ); |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
788 |
} |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
789 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
790 |
return NULL; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
791 |
} |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
792 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
793 |
// -------------------------------------------------------------- """ ]] |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
794 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
795 |
Here you also see a lot of new types: |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
796 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
797 |
* 'color_statusmask' - specific to "/color" command wrapper over generic type |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
798 |
'charset'. This type allows only word "clear" or string, composed of |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
799 |
specified in 'chkdata' field characters, in this case tese are, of course, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
800 |
"ofdna_?". |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
801 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
802 |
* 'bjidmask' - this type only provides completion, otherwise it is the same as |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
803 |
'nonspace'. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
804 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
805 |
* 'color' - checks value to be a valid name of mcabber color. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
806 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
807 |
* 'color_roomjid' - specific to "/color" command wrapper over type 'bjid'. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
808 |
Type allows the string "*" or a valid bare jid. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
809 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
810 |
* 'string2enum' - generic type, that converts string into unsigned integer |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
811 |
value according to given in 'chkdata' dictionary of name-value pairs. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
812 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
813 |
* 'nick' - as 'bjidmask' - only provides completion. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
814 |
|
82
06d4a9185902
[cmdopts] Fix documentation errors
Myhailo Danylenko <isbear@ukrpost.net>
parents:
81
diff
changeset
|
815 |
Note, that although here I used value indexes 1 and 2 several times for |
06d4a9185902
[cmdopts] Fix documentation errors
Myhailo Danylenko <isbear@ukrpost.net>
parents:
81
diff
changeset
|
816 |
different arguments, it is not "clustering", as they are used in different |
06d4a9185902
[cmdopts] Fix documentation errors
Myhailo Danylenko <isbear@ukrpost.net>
parents:
81
diff
changeset
|
817 |
subcommands. |
06d4a9185902
[cmdopts] Fix documentation errors
Myhailo Danylenko <isbear@ukrpost.net>
parents:
81
diff
changeset
|
818 |
|
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
819 |
## Argument types |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
820 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
821 |
Let's take a look at simple checker, that we've encountered first - 'nonspace': |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
822 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
823 |
[[!format c """// -------------------------------------------------------------- |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
824 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
825 |
// Checker gets parsed value string in 'value.arg', argument description in |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
826 |
// 'src' and returns error string or NULL. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
827 |
gchar *cmdarg_check_nonspace (cmdarg_value_t *arg) |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
828 |
{ |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
829 |
// current value |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
830 |
gchar *val = arg -> value.arg; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
831 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
832 |
// was value given at all? |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
833 |
if (val) { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
834 |
// skip leading spaces |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
835 |
while (isspace (*val)) |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
836 |
val ++; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
837 |
if (*val) { // valid arg - string contains non-space symbols |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
838 |
// reassing value in case of stripped leading space |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
839 |
arg -> value.arg = val; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
840 |
// strip trailing space |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
841 |
while (*val) |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
842 |
val ++; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
843 |
while (isspace (*val)) |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
844 |
val --; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
845 |
val ++; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
846 |
// Note: this needs write access, so, default value cannot contain |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
847 |
// trailing spaces! |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
848 |
if (*val) |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
849 |
*val = '\0'; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
850 |
// no error, argument is valid |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
851 |
return NULL; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
852 |
} |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
853 |
} |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
854 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
855 |
// Returned error may be ignored by parser, if 'required' flag is not set on |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
856 |
// argument, so, we nullify argument to ensure, that invalid value will not |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
857 |
// be passed to command. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
858 |
arg -> value.arg = NULL; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
859 |
return g_strdup ("Non-space value required."); |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
860 |
} |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
861 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
862 |
// type definition |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
863 |
const cmdarg_type_t cmdarg_type_nonspace = { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
864 |
// our checker |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
865 |
cmdarg_check_nonspace, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
866 |
// freeing callabck - no need for that |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
867 |
NULL, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
868 |
// completion callabck - none, we can't know, what string may contain |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
869 |
NULL, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
870 |
}; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
871 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
872 |
// -------------------------------------------------------------- """ ]] |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
873 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
874 |
Quite simple, I hope. Now, let's look at more complex type - 'fjid': |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
875 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
876 |
[[!format c """// -------------------------------------------------------------- |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
877 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
878 |
// This checker checks syntax of fjid and expands "current-buddy" expressions |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
879 |
// "." and "./resource". |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
880 |
gchar *cmdarg_check_fjid (cmdarg_value_t *arg) |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
881 |
{ |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
882 |
gchar *error = NULL; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
883 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
884 |
// We're using nonspace checker to check our value - empty string is not a |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
885 |
// valid jid. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
886 |
if (!(error = cmdarg_check_nonspace(arg))) { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
887 |
// Now, we're sure, that we have non-space string |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
888 |
const char *fjid = arg -> value.arg; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
889 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
890 |
// We check for "current-buddy" expression. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
891 |
if (fjid[0] == '.' && |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
892 |
(fjid[1] == JID_RESOURCE_SEPARATOR || fjid[1] == '\0')) { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
893 |
const char *jid; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
894 |
if (!current_buddy) { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
895 |
error = g_strdup_printf ("No buddy selected."); |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
896 |
} else if (!(jid = buddy_getjid(BUDDATA(current_buddy)))) { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
897 |
error = g_strdup_printf ("Current buddy have no jid."); |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
898 |
} else if (fjid[1] == '\0') { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
899 |
arg -> value.roarg = jid; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
900 |
} else { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
901 |
// We allocate value - we will need to free it, so, we as well set |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
902 |
// 'freeme' flag. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
903 |
arg -> value.arg = g_strdup_printf ("%s%c%s", |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
904 |
jid, JID_RESOURCE_SEPARATOR, fjid + 2); |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
905 |
arg -> flags |= cmdval_freeme; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
906 |
} |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
907 |
// this is jid - check, that it is valid |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
908 |
} else if (check_jid_syntax(fjid)) { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
909 |
error = g_strdup_printf ("Jid <%s> is invalid.", fjid); |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
910 |
} |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
911 |
} |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
912 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
913 |
// As before, nullify value in case of error |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
914 |
if (error) |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
915 |
arg -> value.arg = NULL; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
916 |
return error; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
917 |
} |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
918 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
919 |
// Free callback will be called only if freeme flag is set, so, we can |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
920 |
// just g_free() value without any checks. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
921 |
void cmdarg_free_gfree (cmdarg_value_t *arg) |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
922 |
{ |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
923 |
g_free (arg -> value.arg); |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
924 |
} |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
925 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
926 |
const cmdarg_type_t cmdarg_type_fjid = { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
927 |
// checker |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
928 |
cmdarg_check_fjid, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
929 |
// freer |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
930 |
cmdarg_free_gfree, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
931 |
// completor, while possible, is not implemented, as whole completion system is |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
932 |
// not yet designed. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
933 |
NULL, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
934 |
}; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
935 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
936 |
// -------------------------------------------------------------- """ ]] |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
937 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
938 |
If possible, you are encouraged to re-use existing checkers - for example, bjid |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
939 |
checker uses fjid checker to expand "current-buddy" expressions and check |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
940 |
syntax, and only strips resource afterwards: |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
941 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
942 |
[[!format c """// -------------------------------------------------------------- |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
943 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
944 |
gchar *cmdarg_check_bjid (cmdarg_value_t *arg) |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
945 |
{ |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
946 |
gchar *error = NULL; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
947 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
948 |
if (!(error = cmdarg_check_fjid(arg))) { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
949 |
gchar *res = strchr (arg -> value.arg, JID_RESOURCE_SEPARATOR); |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
950 |
if (res != NULL) |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
951 |
*res = '\0'; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
952 |
} |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
953 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
954 |
// Error can only happen inside fjid callback, that will nullify argument |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
955 |
// for us. |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
956 |
return error; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
957 |
} |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
958 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
959 |
const cmdarg_type_t cmdarg_type_bjid = { |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
960 |
cmdarg_check_bjid, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
961 |
// may need to free value - we're using fjid checker internally |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
962 |
cmdarg_free_gfree, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
963 |
NULL, |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
964 |
}; |
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
965 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
966 |
// -------------------------------------------------------------- """ ]] |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
967 |
|
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
968 |
So far we've only modified string in value. But checkers are not limited to |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
969 |
this, for example, uint checker performs atoi() on value and assigns resulting |
81
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
970 |
number to value.uint. Take a look at definition of cmdarg_value_t struct - |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
971 |
value is actually a union of different types of value. If you need something |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
972 |
different from existing - you can always allocate your own struct and use |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
973 |
value.ptr. However, if you think, that your case is generic enough - contact |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
974 |
mcabber developers, we'll consider adding more variants there. Maybe we'll even |
8e1ccd27d60f
[cmdopts] Constantize some more fields
Myhailo Danylenko <isbear@ukrpost.net>
parents:
80
diff
changeset
|
975 |
add your argument type to built-in types. |
80
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
976 |
|
93088d0c8140
Add documentation for cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff
changeset
|
977 |
<!-- vim: se ts=4 sw=4 et filetype=markdown tw=80: --> |