docs/cmdopts.mdwn
author Myhailo Danylenko <isbear@ukrpost.net>
Sun, 24 Mar 2013 00:59:26 +0200
changeset 84 6ff846816073
parent 82 06d4a9185902
permissions -rw-r--r--
[cmdopts] A bit of progress
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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: -->