cmdopts.diff
author Myhailo Danylenko <isbear@ukrpost.net>
Mon, 25 Feb 2013 01:01:36 +0200
changeset 66 5616a2397c3c
parent 65 7e44adeed9a7
child 67 a2f3afbc4000
permissions -rw-r--r--
Convert /roster
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
64
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     1
# HG changeset patch
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     2
# Parent 92fa48ef53c909928706ab4c51518953339a38e4
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     3
Unified command option parsing
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     4
66
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
     5
  * cmdopts_parse() & cmdopts_free() in utils.c/h
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
     6
  * /roster uses parser
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
     7
    * buddy_search() now expects argument in utf8
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
     8
  * /say_to uses parser
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
     9
65
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
    10
diff -r 92fa48ef53c9 mcabber/mcabber/commands.c
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
    11
--- a/mcabber/mcabber/commands.c	Sun Jan 27 00:40:37 2013 +0200
66
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    12
+++ b/mcabber/mcabber/commands.c	Mon Feb 25 00:57:09 2013 +0200
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    13
@@ -755,7 +755,7 @@
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    14
   g_slist_free(notes);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    15
 }
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    16
 
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    17
-static void roster_note(char *arg)
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    18
+static void roster_note(gchar *arg)
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    19
 {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    20
   const char *bjid;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    21
   guint type;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    22
@@ -781,14 +781,9 @@
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    23
   }
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    24
 
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    25
   if (arg && *arg) {  // Set a note
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    26
-    gchar *msg, *notetxt;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    27
-    msg = to_utf8(arg);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    28
-    if (!strcmp(msg, "-"))
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    29
-      notetxt = NULL; // delete note
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    30
-    else
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    31
-      notetxt = msg;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    32
-    xmpp_set_storage_rosternotes(bjid, notetxt);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    33
-    g_free(msg);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    34
+    if (!strcmp(arg, "-"))
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    35
+      arg = NULL; // delete note
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    36
+    xmpp_set_storage_rosternotes(bjid, arg);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    37
   } else {      // Display a note
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    38
     struct annotation *note = xmpp_get_storage_rosternotes(bjid, FALSE);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    39
     if (note) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    40
@@ -819,86 +814,136 @@
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    41
 /* All these do_*() functions will be called with a "arg" parameter */
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    42
 /* (with arg not null)                                              */
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    43
 
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    44
-static void do_roster(char *arg)
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    45
+static void do_roster(char *args)
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    46
 {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    47
-  char **paramlst;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    48
-  char *subcmd;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    49
-
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    50
-  paramlst = split_arg(arg, 2, 1); // subcmd, arg
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    51
-  subcmd = *paramlst;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    52
-  arg = *(paramlst+1);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    53
-
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    54
-  if (!subcmd || !*subcmd) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    55
-    scr_LogPrint(LPRINT_NORMAL, "Missing parameter.");
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    56
-    free_arg_lst(paramlst);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    57
-    return;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    58
+  enum roster_subcommand_t {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    59
+    roster_scmd_bottom, roster_scmd_top, roster_scmd_up, roster_scmd_down,
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    60
+    roster_scmd_group_prev, roster_scmd_group_next,
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    61
+    roster_scmd_alternate,
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    62
+    roster_scmd_unread_first, roster_scmd_unread_next,
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    63
+    roster_scmd_search,
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    64
+    roster_scmd_display,
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    65
+    roster_scmd_hide_offline, roster_scmd_show_offline, roster_scmd_toggle_offline,
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    66
+    roster_scmd_item_lock, roster_scmd_item_unlock, roster_scmd_item_toggle_lock,
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    67
+    roster_scmd_note,
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    68
+    roster_scmd_resource_lock, roster_scmd_resource_unlock,
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    69
+    roster_scmd_hide, roster_scmd_show, roster_scmd_toggle,
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    70
+  } subcmd;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    71
+#define ROSTER_SCMD_NOARG(NAME) \
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    72
+      { 0, #NAME, { NULL, NULL, NULL, NULL }, (gpointer)roster_scmd_##NAME }
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    73
+// all of them have at most one argument
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    74
+#define ROSTER_SCMD(NAME, FLAGS, VALUE) \
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    75
+      { 0, #NAME, { NULL, \
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    76
+                    (cmdarg_t[1]){ \
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    77
+                      { CMDOPT_LAST | FLAGS, { .arg = VALUE } } \
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    78
+                    }, NULL, NULL }, (gpointer)roster_scmd_##NAME }
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    79
+  cmdopts_t options = {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    80
+    NULL,
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    81
+    (cmdarg_t[1]){
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    82
+      { CMDOPT_REQUIRED | CMDOPT_SUBCOMMAND | CMDOPT_LAST, { .cmd = NULL } }
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    83
+    },
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    84
+    (subcmd_t[23]){
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    85
+      ROSTER_SCMD_NOARG(bottom),
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    86
+      ROSTER_SCMD_NOARG(top),
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    87
+      ROSTER_SCMD(up,               0, "1"),
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    88
+      ROSTER_SCMD(down,             0, "1"),
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    89
+      ROSTER_SCMD_NOARG(group_prev),
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    90
+      ROSTER_SCMD_NOARG(group_next),
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    91
+      ROSTER_SCMD_NOARG(alternate),
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    92
+      ROSTER_SCMD_NOARG(unread_first),
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    93
+      ROSTER_SCMD_NOARG(unread_next),
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    94
+      ROSTER_SCMD(search,           CMDOPT_REQUIRED, NULL),
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    95
+      ROSTER_SCMD(display,          0, NULL),
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    96
+      ROSTER_SCMD_NOARG(hide_offline),
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    97
+      ROSTER_SCMD_NOARG(show_offline),
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    98
+      ROSTER_SCMD_NOARG(toggle_offline),
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
    99
+      ROSTER_SCMD(item_lock,        0, "."),
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   100
+      ROSTER_SCMD(item_unlock,      0, "."),
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   101
+      ROSTER_SCMD(item_toggle_lock, 0, "."),
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   102
+      ROSTER_SCMD(note,             0, NULL),
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   103
+      ROSTER_SCMD(resource_lock,    0, NULL),
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   104
+      ROSTER_SCMD(resource_unlock,  0, NULL),
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   105
+      ROSTER_SCMD_NOARG(hide),
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   106
+      ROSTER_SCMD_NOARG(show),
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   107
+      { CMDOPT_LAST, "toggle", { NULL, NULL, NULL, NULL },
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   108
+        (gpointer)roster_scmd_toggle },
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   109
+    },
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   110
+    NULL,
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   111
+  };
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   112
+  gchar *arg;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   113
+
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   114
+  {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   115
+    const char *error = cmdopts_parse (args, &options);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   116
+    if (error != NULL) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   117
+      scr_log_print (LPRINT_NORMAL, error);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   118
+      return;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   119
+    }
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   120
   }
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   121
 
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   122
-  if (!strcasecmp(subcmd, "top")) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   123
+  subcmd = (enum roster_subcommand_t) (options.args[0].value.cmd -> userdata);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   124
+  if (options.args[0].value.cmd -> options.args != NULL) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   125
+    arg = options.args[0].value.cmd -> options.args[0].value.arg;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   126
+  }
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   127
+
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   128
+  if (subcmd == roster_scmd_top) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   129
     scr_roster_top();
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   130
     update_roster = TRUE;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   131
-  } else if (!strcasecmp(subcmd, "bottom")) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   132
+  } else if (subcmd == roster_scmd_bottom) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   133
     scr_roster_bottom();
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   134
     update_roster = TRUE;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   135
-  } else if (!strcasecmp(subcmd, "hide")) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   136
+  } else if (subcmd == roster_scmd_hide) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   137
     scr_roster_visibility(0);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   138
-  } else if (!strcasecmp(subcmd, "show")) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   139
+  } else if (subcmd == roster_scmd_show) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   140
     scr_roster_visibility(1);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   141
-  } else if (!strcasecmp(subcmd, "toggle")) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   142
+  } else if (subcmd == roster_scmd_toggle) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   143
     scr_roster_visibility(-1);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   144
-  } else if (!strcasecmp(subcmd, "hide_offline")) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   145
+  } else if (subcmd == roster_scmd_hide_offline) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   146
     buddylist_set_hide_offline_buddies(TRUE);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   147
     if (current_buddy)
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   148
       buddylist_build();
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   149
     update_roster = TRUE;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   150
-  } else if (!strcasecmp(subcmd, "show_offline")) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   151
+  } else if (subcmd == roster_scmd_show_offline) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   152
     buddylist_set_hide_offline_buddies(FALSE);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   153
     buddylist_build();
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   154
     update_roster = TRUE;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   155
-  } else if (!strcasecmp(subcmd, "toggle_offline")) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   156
+  } else if (subcmd == roster_scmd_toggle_offline) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   157
     buddylist_set_hide_offline_buddies(-1);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   158
     buddylist_build();
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   159
     update_roster = TRUE;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   160
-  } else if (!strcasecmp(subcmd, "display")) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   161
+  } else if (subcmd == roster_scmd_display) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   162
     scr_roster_display(arg);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   163
-  } else if (!strcasecmp(subcmd, "item_lock")) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   164
+  } else if (subcmd == roster_scmd_item_lock) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   165
     roster_buddylock(arg, 1);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   166
-  } else if (!strcasecmp(subcmd, "item_unlock")) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   167
+  } else if (subcmd == roster_scmd_item_unlock) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   168
     roster_buddylock(arg, 0);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   169
-  } else if (!strcasecmp(subcmd, "item_toggle_lock")) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   170
+  } else if (subcmd == roster_scmd_item_toggle_lock) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   171
     roster_buddylock(arg, -1);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   172
-  } else if (!strcasecmp(subcmd, "unread_first")) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   173
+  } else if (subcmd == roster_scmd_unread_first) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   174
     scr_roster_unread_message(0);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   175
-  } else if (!strcasecmp(subcmd, "unread_next")) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   176
+  } else if (subcmd == roster_scmd_unread_next) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   177
     scr_roster_unread_message(1);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   178
-  } else if (!strcasecmp(subcmd, "alternate")) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   179
+  } else if (subcmd == roster_scmd_alternate) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   180
     scr_roster_jump_alternate();
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   181
-  } else if (!strncasecmp(subcmd, "search", 6)) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   182
-    strip_arg_special_chars(arg);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   183
-    if (!arg || !*arg) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   184
-      scr_LogPrint(LPRINT_NORMAL, "What name or JID are you looking for?");
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   185
-      free_arg_lst(paramlst);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   186
-      return;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   187
-    }
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   188
+  } else if (subcmd == roster_scmd_search) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   189
     scr_roster_search(arg);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   190
     update_roster = TRUE;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   191
-  } else if (!strcasecmp(subcmd, "up")) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   192
+  } else if (subcmd == roster_scmd_up) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   193
     roster_updown(-1, arg);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   194
-  } else if (!strcasecmp(subcmd, "down")) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   195
+  } else if (subcmd == roster_scmd_down) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   196
     roster_updown(1, arg);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   197
-  } else if (!strcasecmp(subcmd, "group_prev")) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   198
+  } else if (subcmd == roster_scmd_group_prev) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   199
     scr_roster_prev_group();
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   200
-  } else if (!strcasecmp(subcmd, "group_next")) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   201
+  } else if (subcmd == roster_scmd_group_next) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   202
     scr_roster_next_group();
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   203
-  } else if (!strcasecmp(subcmd, "note")) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   204
+  } else if (subcmd == roster_scmd_note) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   205
     roster_note(arg);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   206
-  } else if (!strcasecmp(subcmd, "resource_lock")) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   207
+  } else if (subcmd == roster_scmd_resource_lock) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   208
     roster_resourcelock(arg, TRUE);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   209
-  } else if (!strcasecmp(subcmd, "resource_unlock")) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   210
+  } else { // roster_resource_unlock
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   211
     roster_resourcelock(arg, FALSE);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   212
-  } else
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   213
-    scr_LogPrint(LPRINT_NORMAL, "Unrecognized parameter!");
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   214
-  free_arg_lst(paramlst);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   215
+  }
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   216
+
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   217
+  cmdopts_free(&options);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   218
 }
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   219
 
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   220
 void do_color(char *arg)
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   221
@@ -1634,130 +1679,109 @@
65
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   222
 
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   223
 static void do_say_to(char *arg)
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   224
 {
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   225
-  char **paramlst;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   226
-  char *fjid, *msg_utf8;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   227
+  char *fjid;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   228
   char *msg;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   229
-  char *unescaped_msg = NULL;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   230
-  char *uncompletedfjid = NULL;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   231
-  char *file = NULL;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   232
+  char *file;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   233
+  gchar *freeme  = NULL; // fjid
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   234
+  gchar *freeme2 = NULL; // msg
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   235
   LmMessageSubType msg_type = LM_MESSAGE_SUB_TYPE_NOT_SET;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   236
-  bool quiet = FALSE;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   237
-  bool eval = FALSE;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   238
+  cmdopts_t options = {
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   239
+    (cmdopt_t[5]){
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   240
+      { CMDOPT_SWITCH, 'n', "normal",   { .swc = 0 }    },
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   241
+      { CMDOPT_SWITCH, 'h', "headline", { .swc = 0 }    },
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   242
+      { CMDOPT_SWITCH, 'e', "escapes",  { .swc = 0 }    },
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   243
+      { CMDOPT_SWITCH, 'q', "quiet",    { .swc = 0 }    },
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   244
+      { CMDOPT_LAST,   'f', "file",     { .opt = NULL } },
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   245
+    },
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   246
+    (cmdarg_t[2]){
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   247
+      { CMDOPT_REQUIRED,                              { .arg = NULL } },
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   248
+      { CMDOPT_LAST | CMDOPT_PLAIN | CMDOPT_CATCHALL, { .arg = NULL } },
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   249
+    },
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   250
+    NULL,
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   251
+    NULL,
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   252
+  };
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   253
 
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   254
   if (!xmpp_is_online()) {
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   255
     scr_LogPrint(LPRINT_NORMAL, "You are not connected.");
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   256
     return;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   257
   }
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   258
 
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   259
-  msg_type = scan_mtype(&arg);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   260
-  paramlst = split_arg(arg, 2, 1); // jid, message (or option, jid, message)
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   261
-
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   262
-  if (!*paramlst) {  // No parameter?
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   263
-    scr_LogPrint(LPRINT_NORMAL, "Please specify a Jabber ID.");
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   264
-    free_arg_lst(paramlst);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   265
-    return;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   266
+  { // parse arguments
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   267
+    const char *error = cmdopts_parse(arg, &options);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   268
+    if (error != NULL) {
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   269
+      scr_log_print(LPRINT_NORMAL, error);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   270
+      return;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   271
+    }
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   272
   }
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   273
 
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   274
-  // Check for an option parameter
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   275
-  while (*paramlst) {
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   276
-    if (!strcmp(*paramlst, "-q")) {
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   277
-      char **oldparamlst = paramlst;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   278
-      paramlst = split_arg(*(oldparamlst+1), 2, 1); // jid, message
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   279
-      free_arg_lst(oldparamlst);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   280
-      quiet = TRUE;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   281
-    } else if (!strcmp(*paramlst, "-e")) {
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   282
-      char **oldparamlst = paramlst;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   283
-      paramlst = split_arg(*(oldparamlst+1), 2, 1); // jid, message
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   284
-      free_arg_lst(oldparamlst);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   285
-      eval = TRUE;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   286
-    } else if (!strcmp(*paramlst, "-f")) {
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   287
-      char **oldparamlst = paramlst;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   288
-      paramlst = split_arg(*(oldparamlst+1), 2, 1); // filename, jid
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   289
-      free_arg_lst(oldparamlst);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   290
-      if (!*paramlst) {
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   291
-        scr_LogPrint(LPRINT_NORMAL, "Wrong usage.");
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   292
-        free_arg_lst(paramlst);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   293
-        return;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   294
-      }
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   295
-      file = g_strdup(*paramlst);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   296
-      // One more parameter shift...
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   297
-      oldparamlst = paramlst;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   298
-      paramlst = split_arg(*(oldparamlst+1), 2, 1); // jid, nothing
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   299
-      free_arg_lst(oldparamlst);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   300
-    } else
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   301
-      break;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   302
+  if (options.opts[0].value.swc) {
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   303
+    msg_type = LM_MESSAGE_SUB_TYPE_NORMAL;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   304
+  } else if (options.opts[1].value.swc) {
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   305
+    msg_type = LM_MESSAGE_SUB_TYPE_HEADLINE;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   306
   }
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   307
 
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   308
-  if (!*paramlst) {
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   309
-    scr_LogPrint(LPRINT_NORMAL, "Wrong usage.");
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   310
-    free_arg_lst(paramlst);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   311
-    return;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   312
-  }
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   313
-
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   314
-  fjid = *paramlst;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   315
-  msg = *(paramlst+1);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   316
-
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   317
+  fjid = options.args[0].value.arg;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   318
+  msg  = options.args[1].value.arg;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   319
+  file = options.opts[4].value.opt;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   320
+
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   321
+  // ideally, this should go to commandline parsing subsystem
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   322
   if (fjid[0] == '.') {
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   323
     const gchar *cjid = (current_buddy ? CURRENT_JID : NULL);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   324
     if (fjid[1] == '\0') {
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   325
-      fjid = g_strdup(cjid);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   326
+      fjid = (char *)cjid; // FIXME
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   327
     } else if (fjid[1] == JID_RESOURCE_SEPARATOR) {
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   328
       char *res_utf8 = to_utf8(fjid+2);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   329
-      fjid = g_strdup_printf("%s%c%s", cjid, JID_RESOURCE_SEPARATOR, res_utf8);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   330
+      freeme = fjid = g_strdup_printf("%s%c%s", cjid, JID_RESOURCE_SEPARATOR, res_utf8);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   331
       g_free(res_utf8);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   332
-    } else
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   333
-      fjid = to_utf8(fjid);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   334
-  } else
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   335
-    fjid = to_utf8(fjid);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   336
-
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   337
+    }
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   338
+  }
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   339
+
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   340
+  // ditto
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   341
   if (!strchr(fjid, JID_DOMAIN_SEPARATOR)) {
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   342
     const gchar *append_server = settings_opt_get("default_server");
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   343
     if (append_server) {
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   344
       gchar *res = strchr(fjid, JID_RESOURCE_SEPARATOR);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   345
-      uncompletedfjid = fjid;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   346
       if (res) {
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   347
         *res++ = '\0';
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   348
         fjid = g_strdup_printf("%s%c%s%c%s", fjid, JID_DOMAIN_SEPARATOR, append_server,
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   349
                                JID_RESOURCE_SEPARATOR, res);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   350
       } else
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   351
         fjid = g_strdup_printf("%s%c%s", fjid, JID_DOMAIN_SEPARATOR, append_server);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   352
+      g_free(freeme);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   353
+      freeme = fjid;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   354
     }
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   355
   }
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   356
 
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   357
+  // as well
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   358
   if (check_jid_syntax(fjid)) {
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   359
     scr_LogPrint(LPRINT_NORMAL, "Please specify a valid Jabber ID.");
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   360
-    free_arg_lst(paramlst);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   361
-    g_free(uncompletedfjid);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   362
-    g_free(fjid);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   363
+    g_free(freeme);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   364
     return;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   365
   }
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   366
 
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   367
-  if (!file) {
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   368
-    msg_utf8 = to_utf8(msg);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   369
-    if (eval) {
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   370
-      unescaped_msg = ut_unescape_tabs_cr(msg_utf8);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   371
+  if (file == NULL) {
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   372
+    if (options.opts[2].value.swc) {
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   373
+      freeme2 = ut_unescape_tabs_cr(msg);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   374
       // We must not free() if the original string was returned
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   375
-      if (unescaped_msg == msg_utf8)
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   376
-        unescaped_msg = NULL;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   377
+      if (freeme2 == msg)
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   378
+        freeme2 = NULL;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   379
+      else
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   380
+        msg = freeme2;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   381
     }
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   382
-    msg = (unescaped_msg ? unescaped_msg : msg_utf8);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   383
   } else {
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   384
     char *filename_xp;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   385
     if (msg)
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   386
       scr_LogPrint(LPRINT_NORMAL, "say_to: extra parameter ignored.");
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   387
     filename_xp = expand_filename(file);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   388
-    msg = msg_utf8 = load_message_from_file(filename_xp);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   389
+    freeme2 = msg = load_message_from_file(filename_xp);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   390
     g_free(filename_xp);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   391
-    g_free(file);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   392
   }
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   393
 
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   394
-  send_message_to(fjid, msg, NULL, msg_type, quiet);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   395
-
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   396
-  g_free(uncompletedfjid);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   397
-  g_free(fjid);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   398
-  g_free(msg_utf8);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   399
-  g_free(unescaped_msg);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   400
-  free_arg_lst(paramlst);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   401
+  send_message_to(fjid, msg, NULL, msg_type, options.opts[3].value.swc);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   402
+
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   403
+  cmdopts_free(&options);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   404
+  g_free(freeme);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   405
+  g_free(freeme2);
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   406
 }
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   407
 
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   408
 //  buffer_updown(updown, nblines)
66
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   409
diff -r 92fa48ef53c9 mcabber/mcabber/roster.c
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   410
--- a/mcabber/mcabber/roster.c	Sun Jan 27 00:40:37 2013 +0200
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   411
+++ b/mcabber/mcabber/roster.c	Mon Feb 25 00:57:09 2013 +0200
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   412
@@ -1586,13 +1586,14 @@
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   413
 // Look for a buddy whose name or jid contains string.
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   414
 // Search begins at current_buddy; if no match is found in the the buddylist,
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   415
 // return NULL;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   416
+// Note: before this function considered its argument to be in local encoding,
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   417
+//       now argument must be in utf8.
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   418
 GList *buddy_search(char *string)
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   419
 {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   420
   GList *buddy = current_buddy;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   421
   roster *roster_usr;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   422
   if (!buddylist || !current_buddy) return NULL;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   423
   for (;;) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   424
-    gchar *jid_locale, *name_locale;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   425
     char *found = NULL;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   426
 
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   427
     buddy = g_list_next(buddy);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   428
@@ -1601,17 +1602,13 @@
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   429
 
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   430
     roster_usr = (roster*)buddy->data;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   431
 
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   432
-    jid_locale = from_utf8(roster_usr->jid);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   433
-    if (jid_locale) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   434
-      found = strcasestr(jid_locale, string);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   435
-      g_free(jid_locale);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   436
+    if (roster_usr->jid) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   437
+      found = strcasestr(roster_usr->jid, string);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   438
       if (found)
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   439
         return buddy;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   440
     }
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   441
-    name_locale = from_utf8(roster_usr->name);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   442
-    if (name_locale) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   443
-      found = strcasestr(name_locale, string);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   444
-      g_free(name_locale);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   445
+    if (roster_usr->name) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   446
+      found = strcasestr(roster_usr->name, string);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   447
       if (found)
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   448
         return buddy;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   449
     }
64
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   450
diff -r 92fa48ef53c9 mcabber/mcabber/utils.c
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   451
--- a/mcabber/mcabber/utils.c	Sun Jan 27 00:40:37 2013 +0200
66
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   452
+++ b/mcabber/mcabber/utils.c	Mon Feb 25 00:57:09 2013 +0200
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   453
@@ -555,6 +555,313 @@
64
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   454
     *str = tolower(*str);
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   455
 }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   456
 
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   457
+// in_space        -> in_space, in_optstart, in_argstart
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   458
+// in_optstart     -> in_shortoptend, in_longoptstart, in_argstart ('-')
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   459
+// in_shortoptend  -> in_space, error
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   460
+// in_longoptstart -> in_longopt, in_space, in_argstart ('---')
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   461
+// in_longopt      -> in_longopt, in_space, error
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   462
+// in_argstart     -> in_arg, success
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   463
+// in_arg          -> in_arg, in_space, error
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   464
+
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   465
+// arguments: rw buffer in utf8, end of buffer pointer, options description struct
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   466
+static const char *cmdopts_parse_internal(gchar *arg, gchar *e, cmdopts_t *options)
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   467
+{
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   468
+  // parser state
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   469
+  enum {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   470
+    in_space,
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   471
+    in_optstart,
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   472
+    in_shortoptstart,
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   473
+    in_shortoptend,
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   474
+    in_longoptstart,
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   475
+    in_longopt,
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   476
+    in_argstart,
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   477
+    in_arg,
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   478
+  } state = in_space;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   479
+  // current pointer, start of object pointer
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   480
+  gchar *p, *s;
66
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   481
+  // inside of quotes in non-plain argument
64
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   482
+  gboolean quotes = FALSE;
66
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   483
+  // non-option argument or end-of-options marker encountered
64
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   484
+  gboolean opts_ended = FALSE;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   485
+  // option, for which argument is currently parsed
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   486
+  cmdopt_t *option = NULL;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   487
+  // argument, that we currently parse
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   488
+  cmdarg_t *argument = NULL;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   489
+  // flags of option/argument
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   490
+  guint flags = 0;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   491
+  // error message to return
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   492
+  const char *error = NULL;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   493
+
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   494
+  p = arg;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   495
+  // we allow parser to do one extra run on final '\0'
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   496
+  while (p <= e && error == NULL) {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   497
+    if (state == in_space) { // space between args/options
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   498
+      if (*p == ' ' || *p == '\0') { // still space
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   499
+        p ++;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   500
+      } else if (*p == '-' && !opts_ended) { // option
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   501
+        state = in_optstart;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   502
+        p ++;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   503
+      } else { // argument
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   504
+        if (!option) {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   505
+          opts_ended = TRUE;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   506
+        }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   507
+        s = p;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   508
+        state = in_argstart;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   509
+      }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   510
+    } else if (state == in_optstart) { // long/short option
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   511
+      if (*p == ' ' || *p == '\0') { // argument '-'
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   512
+        opts_ended = TRUE;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   513
+        s = p - 1;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   514
+        state = in_argstart;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   515
+      } else if (*p == '-') { // long option
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   516
+        state = in_longoptstart;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   517
+        p ++;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   518
+      } else { // short option
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   519
+        s = p;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   520
+        state = in_shortoptend;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   521
+        p ++;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   522
+      }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   523
+    } else if (state == in_shortoptend) { // short option
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   524
+      if (*p == ' ' || *p == '\0') { // option really ended
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   525
+        gboolean found = FALSE;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   526
+        option = options -> opts;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   527
+        if (option) {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   528
+          do {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   529
+            if (option -> shortopt == *s) {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   530
+              found = TRUE;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   531
+              break;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   532
+            }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   533
+          } while ((!(option++ -> flags & CMDOPT_LAST)) && !found);
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   534
+        }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   535
+        if (found) { // option is known
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   536
+          if (option -> flags & CMDOPT_SWITCH) { // it is switch
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   537
+            if (option -> flags & CMDOPT_CATCHALL) {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   538
+              option -> value.swc ++;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   539
+            } else {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   540
+              option -> value.swc = !option -> value.swc;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   541
+            }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   542
+            option = NULL;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   543
+          } else { // it is option
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   544
+            if (*p == '\0') {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   545
+              error = "Short option argument not specified";
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   546
+            }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   547
+          }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   548
+          state = in_space;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   549
+          p ++;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   550
+        } else { // option is unknown
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   551
+          error = "Unknown short option";
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   552
+        }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   553
+      } else { // short option not ended
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   554
+        error = "Extra characters at short option end";
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   555
+      }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   556
+    } else if (state == in_longoptstart) { // long option initialization
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   557
+      if (*p == ' ' || *p == '\0') { // end of options '--'
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   558
+        opts_ended = TRUE;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   559
+        state = in_space;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   560
+        p ++;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   561
+      } else if (*p == '-') { // argument, starting with '---'
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   562
+        opts_ended = TRUE;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   563
+        s = p - 2;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   564
+        state = in_argstart;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   565
+      } else { // it is long option
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   566
+        s = p;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   567
+        state = in_longopt;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   568
+        p ++;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   569
+      }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   570
+    } else if (state == in_longopt) { // long option name
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   571
+      if (*p == ' ' || *p == '\0') { // long option ended
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   572
+        gboolean found = FALSE;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   573
+        gboolean eof = *p == '\0';
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   574
+        *p = '\0';
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   575
+        option = options -> opts;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   576
+        if (option) {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   577
+          do {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   578
+            if (!g_strcmp0 (option -> longopt, s)) {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   579
+              found = TRUE;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   580
+              break;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   581
+            }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   582
+          } while ((!(option++ -> flags & CMDOPT_LAST)) && !found);
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   583
+        }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   584
+        if (found) { // option is known
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   585
+          if (option -> flags & CMDOPT_SWITCH) { // it is switch
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   586
+            if (option -> flags & CMDOPT_CATCHALL) {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   587
+              option -> value.swc ++;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   588
+            } else {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   589
+              option -> value.swc = !option -> value.swc;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   590
+            }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   591
+            option = NULL;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   592
+          } else { // it is option
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   593
+            if (eof) {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   594
+              error = "Long option argument not specified";
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   595
+            }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   596
+          }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   597
+          state = in_space;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   598
+          p ++;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   599
+        } else { // option is unknown
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   600
+          error = "Unknown long option";
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   601
+        }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   602
+      } else { // still long option
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   603
+        p ++;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   604
+      }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   605
+    } else if (state == in_argstart) { // option/command argument initialization
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   606
+      if (option) {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   607
+        flags = option -> flags & ~CMDOPT_CATCHALL; // catchall in options indicates multi-options
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   608
+      } else {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   609
+        if (!argument) {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   610
+          argument = options -> args;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   611
+        }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   612
+        if (!argument) { // no need to parse arguments at all
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   613
+          break;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   614
+        }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   615
+        flags = argument -> flags;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   616
+        if ((flags & CMDOPT_CATCHALL) && (flags & CMDOPT_PLAIN)) { // can finish right away
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   617
+          argument -> value.arg = s;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   618
+          break;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   619
+        }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   620
+      }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   621
+      quotes = FALSE;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   622
+      state = in_arg;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   623
+    } else if (state == in_arg) { // option/command argument value
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   624
+      if (*p == '\0' && quotes) { // end of line in quotes
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   625
+        error = "Unfinished quoted argument";
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   626
+      } else if ((*p == ' ' && (!quotes) && !(flags & CMDOPT_CATCHALL)) || *p == '\0') { // argument ended
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   627
+        if (*p != '\0') {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   628
+          *p = '\0';
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   629
+          p ++;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   630
+        } 
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   631
+        if (option) { // option argument
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   632
+          if (option -> flags & CMDOPT_CATCHALL) { // multi-value option
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   633
+            option -> value.multiopt = g_slist_append (option -> value.multiopt, s);
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   634
+          } else { // single-value option
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   635
+            option -> value.opt = s;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   636
+          }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   637
+          option = NULL;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   638
+        } else { // command argument
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   639
+          if (argument -> flags & CMDOPT_SUBCOMMAND) {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   640
+            gboolean found = FALSE;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   641
+            subcmd_t *subcommand = options -> cmds;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   642
+            if (subcommand) {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   643
+              do {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   644
+                if (!g_strcmp0(s, subcommand -> name)) {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   645
+                  found = TRUE;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   646
+                  break;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   647
+                }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   648
+              } while (!(subcommand++ -> flags & CMDOPT_LAST));
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   649
+            }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   650
+            if (found) {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   651
+              argument -> value.cmd = subcommand;
66
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   652
+              error = cmdopts_parse_internal(p, e, &(subcommand -> options));
64
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   653
+              break;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   654
+            } else {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   655
+              error = "Unknown subcommand";
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   656
+            }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   657
+          } else {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   658
+            argument -> value.arg = s;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   659
+            if (argument -> flags & CMDOPT_LAST) { // last argument
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   660
+              break;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   661
+            }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   662
+            argument ++;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   663
+          }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   664
+        }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   665
+        state = in_space;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   666
+      } else if (*p == '\\' && !(flags & CMDOPT_PLAIN)) { // next char escape
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   667
+        memmove(p, p+1, e-(p+1));
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   668
+        e --;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   669
+        if (*p == '\0') {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   670
+          error = "Escape at the end of line";
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   671
+        }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   672
+        p ++;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   673
+      } else if (*p == '"' && !(flags & CMDOPT_PLAIN)) { // quotation start/end
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   674
+        memmove(p, p+1, e-(p+1));
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   675
+        e --;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   676
+        quotes = !quotes;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   677
+      } else { // still argument
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   678
+        p ++;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   679
+      }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   680
+    }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   681
+  }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   682
+
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   683
+  // check required flags on options
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   684
+  if (error == NULL && options -> opts) {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   685
+    option = options -> opts;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   686
+    do {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   687
+      if (option -> flags & CMDOPT_REQUIRED) {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   688
+        if (option -> flags & CMDOPT_SWITCH) {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   689
+          // no way to check trigger switches, but no point in it as well
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   690
+          if (option -> flags & CMDOPT_CATCHALL && option -> value.swc == 0) {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   691
+            error = "Required switch is not specified";
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   692
+            break;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   693
+          }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   694
+        } else {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   695
+          if ((option -> flags & CMDOPT_CATCHALL && option -> value.multiopt == NULL) ||
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   696
+              ((!(option -> flags & CMDOPT_CATCHALL)) && option -> value.opt == NULL)) {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   697
+            error = "Required option is not specified";
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   698
+            break;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   699
+          }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   700
+        }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   701
+      }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   702
+    } while (!(option++ -> flags & CMDOPT_LAST));
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   703
+  }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   704
+
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   705
+  // check required flags on arguments
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   706
+  if (error == NULL && options -> args) {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   707
+    argument = options -> args;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   708
+    do {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   709
+      if (argument -> flags & CMDOPT_REQUIRED) {
65
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   710
+        if (argument -> flags & CMDOPT_SUBCOMMAND) {
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   711
+          if (argument -> value.cmd == NULL) {
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   712
+            error = "Subcommand is not specified";
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   713
+            break;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   714
+          }
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   715
+        } else {
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   716
+          if (argument -> value.arg == NULL) {
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   717
+            error = "Required argument is not specified";
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   718
+            break;
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   719
+          }
64
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   720
+        }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   721
+      }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   722
+    } while (!(argument++ -> flags & CMDOPT_LAST));
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   723
+  }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   724
+
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   725
+  return error;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   726
+}
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   727
+
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   728
+const char *cmdopts_parse(const char *arg, cmdopts_t *options)
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   729
+{
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   730
+  gchar *utf8 = to_utf8(arg);
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   731
+  gchar *e;
66
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   732
+  const char *error;
64
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   733
+
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   734
+  for (e = utf8; *e; e++);
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   735
+  options -> freeme = utf8;
66
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   736
+  error = cmdopts_parse_internal(utf8, e, options);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   737
+  if (error) {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   738
+    cmdopts_free(options);
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   739
+  }
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   740
+  return error;
64
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   741
+}
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   742
+
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   743
+void cmdopts_free(cmdopts_t *options)
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   744
+{
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   745
+  cmdopt_t *option = options -> opts;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   746
+  subcmd_t *subcommand = options -> cmds;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   747
+  if (option) {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   748
+    do {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   749
+      if ((option -> flags & (CMDOPT_CATCHALL|CMDOPT_SWITCH)) == CMDOPT_CATCHALL) {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   750
+        g_slist_free(option -> value.multiopt);
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   751
+        option -> value.multiopt = NULL;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   752
+      }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   753
+    } while (!(option++ -> flags & CMDOPT_LAST));
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   754
+  }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   755
+  if (subcommand) {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   756
+    do {
66
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   757
+      cmdopts_free(&(subcommand -> options));
64
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   758
+    } while (!(subcommand++ -> flags & CMDOPT_LAST));
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   759
+  }
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   760
+  g_free(options -> freeme);
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   761
+  options -> freeme = NULL;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   762
+}
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   763
+
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   764
 //  strip_arg_special_chars(string)
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   765
 // Remove quotes and backslashes before an escaped quote
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   766
 // Only quotes need a backslash
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   767
diff -r 92fa48ef53c9 mcabber/mcabber/utils.h
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   768
--- a/mcabber/mcabber/utils.h	Sun Jan 27 00:40:37 2013 +0200
66
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   769
+++ b/mcabber/mcabber/utils.h	Mon Feb 25 00:57:09 2013 +0200
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   770
@@ -43,6 +43,101 @@
64
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   771
 char **split_arg(const char *arg, unsigned int n, int dontstriplast);
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   772
 void free_arg_lst(char **arglst);
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   773
 
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   774
+//  error cmdopts_parse (argstring, optionlist)
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   775
+// Function parses command argument string according to provided list of
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   776
+// options and arguments. If in this process it encounters an error, it
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   777
+// returns error string (that should be displayed and g_free'd afterwards).
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   778
+// Note: For now returned error is constant string, that shouldn't be freed,
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   779
+// but we're getting there.
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   780
+// After processing you should free freeme and any GSList values of catchall
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   781
+// options (only lists itself, not values). For your convenience, there is
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   782
+// cmdopts_free(), that does exactly that.
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   783
+// The function recognizes four kinds of expressions:
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   784
+//  - Options with arguments in a form '-f bar' or '--foo bar'
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   785
+//  - Switches without arguments in a form '-f' or '--foo'
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   786
+//  - End-of-options marker '--'
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   787
+//  - Individual arguments ('-' and '---' are considered arguments too)
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   788
+// To define command line syntax, you pass cmdopts_t struct, that contains
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   789
+// two contiguous lists of cmdopt_t and cmdarg_t structs accordingly. The
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   790
+// last struct in list must have CMDOPT_LAST flag set.
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   791
+// You can specify your own default values, they will be replaced/appended
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   792
+// if needed.
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   793
+// You can omit specifying longopt or shortopt (put NULL or '\0' there).
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   794
+// Note: returned values and arguments are already converted to utf8.
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   795
+
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   796
+// Flags:
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   797
+// Only applies to options, defined if option does not have argument.
65
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   798
+#define CMDOPT_SWITCH     ( 1<<0 )
64
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   799
+// Don't process quotes and escapes in argument (applies to option arguments too).
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   800
+#define CMDOPT_PLAIN      ( 1<<1 )
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   801
+// For options   - put all encountered values into GSList value.multiopt
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   802
+//                 instead of overwriting value.opt.
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   803
+// For switches  - increment value.swc instead of logical flipping.
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   804
+// For arguments - grab the rest of the line without splitting on spaces.
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   805
+// Implicitly last argument.
65
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   806
+#define CMDOPT_CATCHALL   ( 1<<2 )
64
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   807
+// Option/argument must have value.
65
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   808
+#define CMDOPT_REQUIRED   ( 1<<3 )
64
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   809
+// Last entry in struct sequence.
65
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   810
+#define CMDOPT_LAST       ( 1<<4 )
64
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   811
+// Argument only, argument is the name for subcommand.
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   812
+// Implicitly last argument.
65
7e44adeed9a7 Fixes to cmdopts
Myhailo Danylenko <isbear@ukrpost.net>
parents: 64
diff changeset
   813
+#define CMDOPT_SUBCOMMAND ( 1<<5 )
64
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   814
+
66
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   815
+// FURTHER TODO:
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   816
+// Allow to specify catchall argument in the middle of string (requires some reverse parser)?
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   817
+// Better error messages (caller frees them)
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   818
+// --help generates error with short usage, based on info in options struct
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   819
+
64
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   820
+// thoughts about future:
66
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   821
+// integration with command structure
64
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   822
+// cmdopt/cmdarg struct contains argument type, that implies completion id and argument correctness checks
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   823
+// cmdopt/cmdarg struct contains default value
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   824
+// when building completion for command, we allow options (if not before --)
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   825
+//
66
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   826
+// so, the process of command execution would look like:
64
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   827
+// - we walk through the options, set default values
66
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   828
+// - we parse argument string, populating options  - on this or on next step
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   829
+// - we check for required options availability    - we can call generic argument check routine, based on argument type
64
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   830
+// - we call callback
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   831
+// - we free resources
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   832
+typedef struct cmdopts_struct cmdopts_t;
66
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   833
+typedef struct subcmd_struct subcmd_t;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   834
+typedef union {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   835
+  GSList *multiopt;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   836
+  gchar  *opt;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   837
+  guint  swc;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   838
+} cmdopt_value_t;
64
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   839
+typedef struct {
66
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   840
+  guint          flags;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   841
+  char           shortopt;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   842
+  const char     *longopt;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   843
+  cmdopt_value_t value;
64
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   844
+} cmdopt_t;
66
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   845
+typedef union {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   846
+  gchar    *arg;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   847
+  subcmd_t *cmd;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   848
+} cmdarg_value_t;
64
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   849
+typedef struct {
66
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   850
+  guint          flags;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   851
+  cmdarg_value_t value;
64
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   852
+} cmdarg_t;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   853
+struct cmdopts_struct {
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   854
+  cmdopt_t *opts;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   855
+  cmdarg_t *args;
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   856
+  subcmd_t *cmds;
66
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   857
+  gchar    *freeme; // private
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   858
+};
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   859
+struct subcmd_struct {
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   860
+  guint      flags;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   861
+  const char *name;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   862
+  cmdopts_t  options;
5616a2397c3c Convert /roster
Myhailo Danylenko <isbear@ukrpost.net>
parents: 65
diff changeset
   863
+  gpointer   userdata; // unused, for user convenience
64
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   864
+};
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   865
+
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   866
+const char *cmdopts_parse (const char *arg, cmdopts_t *options);
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   867
+void cmdopts_free(cmdopts_t *options);
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   868
+
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   869
 void replace_nl_with_dots(char *bufstr);
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   870
 char *ut_expand_tabs(const char *text);
d328b18462bd Add cmdopts.diff
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   871
 char *ut_unescape_tabs_cr(const char *text);