# HG changeset patch # User Myhailo Danylenko # Date 1363137791 -7200 # Node ID 7197414053c9c2983acbbee728fb817d226e614b # Parent 3c8b784f92c79dc715d51c1e833cf5510ab47162 [cmdopts] Roll some things back, fix errors Bloody C structure initializer syntax - had to switch back to contiguous struct list instead of addresses. diff -r 3c8b784f92c7 -r 7197414053c9 cmdopts.diff --- a/cmdopts.diff Tue Mar 12 01:23:02 2013 +0200 +++ b/cmdopts.diff Wed Mar 13 03:23:11 2013 +0200 @@ -35,7 +35,7 @@ diff -r b527e8800278 mcabber/doc/help/cs/hlp_buffer.txt --- a/mcabber/doc/help/cs/hlp_buffer.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/cs/hlp_buffer.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/cs/hlp_buffer.txt Wed Mar 13 03:21:24 2013 +0200 @@ -25,7 +25,7 @@ Přesune se o [n] řádků nahoru (výchozí: polovina obrazovky). /buffer down [n] @@ -47,7 +47,7 @@ Přesune se na procentuální pozici n%. diff -r b527e8800278 mcabber/doc/help/cs/hlp_del.txt --- a/mcabber/doc/help/cs/hlp_del.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/cs/hlp_del.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/cs/hlp_del.txt Wed Mar 13 03:21:24 2013 +0200 @@ -1,4 +1,4 @@ - /DEL @@ -56,7 +56,7 @@ Smaže aktuální kontakt ze seznamu kontaktů (rosteru) a zruší povolení oznamování o stavu daného kontaktu (autorizaci) na obou stranách. diff -r b527e8800278 mcabber/doc/help/cs/hlp_move.txt --- a/mcabber/doc/help/cs/hlp_move.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/cs/hlp_move.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/cs/hlp_move.txt Wed Mar 13 03:21:24 2013 +0200 @@ -1,5 +1,6 @@ - /MOVE [skupina] @@ -67,7 +67,7 @@ Tip: V módu rozhovoru lze použít "/roster alternate" pro skok na přesunutý kontakt. diff -r b527e8800278 mcabber/doc/help/cs/hlp_rename.txt --- a/mcabber/doc/help/cs/hlp_rename.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/cs/hlp_rename.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/cs/hlp_rename.txt Wed Mar 13 03:21:24 2013 +0200 @@ -1,4 +1,6 @@ - /RENAME jméno @@ -79,7 +79,7 @@ +Optionally you can use one of --jid, --group or --name to select object, different from current. diff -r b527e8800278 mcabber/doc/help/de/hlp_buffer.txt --- a/mcabber/doc/help/de/hlp_buffer.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/de/hlp_buffer.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/de/hlp_buffer.txt Wed Mar 13 03:21:24 2013 +0200 @@ -25,7 +25,7 @@ Scrollt den Puffer um n Zeilen hoch. Gibt man keine Zahl an, scrollt er um einen halben Bildschirm /buffer down [n] @@ -91,7 +91,7 @@ Springe zur Position "n" im Chatpuffer diff -r b527e8800278 mcabber/doc/help/de/hlp_del.txt --- a/mcabber/doc/help/de/hlp_del.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/de/hlp_del.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/de/hlp_del.txt Wed Mar 13 03:21:24 2013 +0200 @@ -1,4 +1,4 @@ - /DEL @@ -100,7 +100,7 @@ Löscht den gerade ausgewählten Buddy vom Roster. Außerdem werden die automatischen Presence Benachrichtigungen vom/zum Buddy gestoppt. diff -r b527e8800278 mcabber/doc/help/de/hlp_move.txt --- a/mcabber/doc/help/de/hlp_move.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/de/hlp_move.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/de/hlp_move.txt Wed Mar 13 03:21:24 2013 +0200 @@ -1,6 +1,7 @@ - /MOVE [groupname] @@ -112,7 +112,7 @@ Tipp: Wenn der Chatmodus aktiviert ist, kannst du "/roster alternate" benutzen um zu dem gerade bewegten Buddy zu springen. diff -r b527e8800278 mcabber/doc/help/de/hlp_rename.txt --- a/mcabber/doc/help/de/hlp_rename.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/de/hlp_rename.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/de/hlp_rename.txt Wed Mar 13 03:21:24 2013 +0200 @@ -1,4 +1,6 @@ - /RENAME name @@ -124,7 +124,7 @@ +Optionally you can use one of --jid, --group or --name to select object, different from current. diff -r b527e8800278 mcabber/doc/help/en/hlp_buffer.txt --- a/mcabber/doc/help/en/hlp_buffer.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/en/hlp_buffer.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/en/hlp_buffer.txt Wed Mar 13 03:21:24 2013 +0200 @@ -25,7 +25,7 @@ Scroll the buffer up [n] lines (default: half a screen) /buffer down [n] @@ -136,7 +136,7 @@ Jump to position %n of the buddy chat buffer diff -r b527e8800278 mcabber/doc/help/en/hlp_del.txt --- a/mcabber/doc/help/en/hlp_del.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/en/hlp_del.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/en/hlp_del.txt Wed Mar 13 03:21:24 2013 +0200 @@ -1,4 +1,4 @@ - /DEL @@ -146,7 +146,7 @@ +Delete the current buddy or one, specified with [jid] from our roster, unsubscribe from its presence notification and unsubscribe it from ours. diff -r b527e8800278 mcabber/doc/help/en/hlp_move.txt --- a/mcabber/doc/help/en/hlp_move.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/en/hlp_move.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/en/hlp_move.txt Wed Mar 13 03:21:24 2013 +0200 @@ -1,5 +1,6 @@ - /MOVE [groupname] @@ -157,7 +157,7 @@ Tip: if the chatmode is enabled, you can use "/roster alternate" to jump to the moved buddy. diff -r b527e8800278 mcabber/doc/help/en/hlp_rename.txt --- a/mcabber/doc/help/en/hlp_rename.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/en/hlp_rename.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/en/hlp_rename.txt Wed Mar 13 03:21:24 2013 +0200 @@ -1,4 +1,6 @@ - /RENAME name @@ -169,7 +169,7 @@ +Optionally you can use one of --jid, --group or --name to select object, different from current. diff -r b527e8800278 mcabber/doc/help/fr/hlp_buffer.txt --- a/mcabber/doc/help/fr/hlp_buffer.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/fr/hlp_buffer.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/fr/hlp_buffer.txt Wed Mar 13 03:21:24 2013 +0200 @@ -25,7 +25,7 @@ Défile vers le haut de [n] lignes (par défaut un demi écran) /buffer down [n] @@ -181,7 +181,7 @@ Va à la position n% du tampon diff -r b527e8800278 mcabber/doc/help/fr/hlp_del.txt --- a/mcabber/doc/help/fr/hlp_del.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/fr/hlp_del.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/fr/hlp_del.txt Wed Mar 13 03:21:24 2013 +0200 @@ -1,4 +1,4 @@ - /DEL @@ -190,7 +190,7 @@ Supprime le contact sélectionné du roster, supprime notre abonnement à ses notifications de présence et supprime son abonnement aux nôtres. diff -r b527e8800278 mcabber/doc/help/fr/hlp_move.txt --- a/mcabber/doc/help/fr/hlp_move.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/fr/hlp_move.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/fr/hlp_move.txt Wed Mar 13 03:21:24 2013 +0200 @@ -1,5 +1,6 @@ - /MOVE [groupname] @@ -201,7 +201,7 @@ Astuce : si le mode discussion (chatmode) est activé, vous pouvez utiliser "/roster alternate" pour vous positionner sur le contact que vous venez de déplacer. diff -r b527e8800278 mcabber/doc/help/fr/hlp_rename.txt --- a/mcabber/doc/help/fr/hlp_rename.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/fr/hlp_rename.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/fr/hlp_rename.txt Wed Mar 13 03:21:24 2013 +0200 @@ -1,4 +1,6 @@ - /RENAME nom @@ -213,7 +213,7 @@ +Optionally you can use one of --jid, --group or --name to select object, different from current. diff -r b527e8800278 mcabber/doc/help/it/hlp_buffer.txt --- a/mcabber/doc/help/it/hlp_buffer.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/it/hlp_buffer.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/it/hlp_buffer.txt Wed Mar 13 03:21:24 2013 +0200 @@ -25,7 +25,7 @@ Fa scorrere indietro il buffer di [n] linee (default: metà schermo) /buffer down [n] @@ -225,7 +225,7 @@ Salta alla posizione %n del buffer di chat corrente diff -r b527e8800278 mcabber/doc/help/it/hlp_del.txt --- a/mcabber/doc/help/it/hlp_del.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/it/hlp_del.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/it/hlp_del.txt Wed Mar 13 03:21:24 2013 +0200 @@ -1,4 +1,4 @@ - /DEL @@ -234,7 +234,7 @@ Elimina il contatto corrente dal roster, cancellando la sottoscrizione alle reciproche notifiche della propria presenza. diff -r b527e8800278 mcabber/doc/help/it/hlp_move.txt --- a/mcabber/doc/help/it/hlp_move.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/it/hlp_move.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/it/hlp_move.txt Wed Mar 13 03:21:24 2013 +0200 @@ -1,5 +1,6 @@ - /MOVE [gruppo] @@ -245,7 +245,7 @@ Trucco: se la modalità chat è abilitata, puoi usare "/roster alternate" per spostarti sul contatto appena mosso. diff -r b527e8800278 mcabber/doc/help/it/hlp_rename.txt --- a/mcabber/doc/help/it/hlp_rename.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/it/hlp_rename.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/it/hlp_rename.txt Wed Mar 13 03:21:24 2013 +0200 @@ -1,4 +1,6 @@ - /RENAME nome @@ -257,7 +257,7 @@ +Optionally you can use one of --jid, --group or --name to select object, different from current. diff -r b527e8800278 mcabber/doc/help/nl/hlp_buffer.txt --- a/mcabber/doc/help/nl/hlp_buffer.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/nl/hlp_buffer.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/nl/hlp_buffer.txt Wed Mar 13 03:21:24 2013 +0200 @@ -25,7 +25,7 @@ Scroll de buffer [n] regels omhoog (standaard: een half scherm) /buffer down [n] @@ -269,7 +269,7 @@ Spring naar positie %n in de buddy chat buffer diff -r b527e8800278 mcabber/doc/help/nl/hlp_del.txt --- a/mcabber/doc/help/nl/hlp_del.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/nl/hlp_del.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/nl/hlp_del.txt Wed Mar 13 03:21:24 2013 +0200 @@ -1,4 +1,4 @@ - /DEL @@ -278,7 +278,7 @@ Verwijder de actieve buddy uit ons roster, en zet het wederzijds toezenden van status veranderingen stop. diff -r b527e8800278 mcabber/doc/help/nl/hlp_move.txt --- a/mcabber/doc/help/nl/hlp_move.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/nl/hlp_move.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/nl/hlp_move.txt Wed Mar 13 03:21:24 2013 +0200 @@ -1,5 +1,6 @@ - /MOVE [groepsnaam] @@ -289,7 +289,7 @@ Tip: indien chatmode actief is, kun je "/roster alternate" gebruiken om direct naar de verplaatste buddy te springen. diff -r b527e8800278 mcabber/doc/help/nl/hlp_rename.txt --- a/mcabber/doc/help/nl/hlp_rename.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/nl/hlp_rename.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/nl/hlp_rename.txt Wed Mar 13 03:21:24 2013 +0200 @@ -1,4 +1,6 @@ - /RENAME naam @@ -301,7 +301,7 @@ +Optionally you can use one of --jid, --group or --name to select object, different from current. diff -r b527e8800278 mcabber/doc/help/pl/hlp_del.txt --- a/mcabber/doc/help/pl/hlp_del.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/pl/hlp_del.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/pl/hlp_del.txt Wed Mar 13 03:21:24 2013 +0200 @@ -1,4 +1,4 @@ - /DEL @@ -310,7 +310,7 @@ Usuwa aktualnie zaznaczoną osobę z rostera, usuwa subskrypcję powiadomienia dostępności u danej osoby oraz u nas. diff -r b527e8800278 mcabber/doc/help/pl/hlp_move.txt --- a/mcabber/doc/help/pl/hlp_move.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/pl/hlp_move.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/pl/hlp_move.txt Wed Mar 13 03:21:24 2013 +0200 @@ -1,5 +1,6 @@ - /MOVE [nazwa grupy] @@ -321,7 +321,7 @@ Podpowiedź: jeśli jest włączony tryb czatu, możesz użyć "/roster alternate" aby skoczyć do przeniesionej osoby. diff -r b527e8800278 mcabber/doc/help/pl/hlp_rename.txt --- a/mcabber/doc/help/pl/hlp_rename.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/pl/hlp_rename.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/pl/hlp_rename.txt Wed Mar 13 03:21:24 2013 +0200 @@ -1,4 +1,6 @@ - /RENAME nazwa @@ -333,7 +333,7 @@ +Optionally you can use one of --jid, --group or --name to select object, different from current. diff -r b527e8800278 mcabber/doc/help/ru/hlp_buffer.txt --- a/mcabber/doc/help/ru/hlp_buffer.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/ru/hlp_buffer.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/ru/hlp_buffer.txt Wed Mar 13 03:21:24 2013 +0200 @@ -25,7 +25,7 @@ Перемещает на [n] строк вверх в буфере (истории переписки) (по умолчанию: половина экрана) /buffer down [n] @@ -345,7 +345,7 @@ Перемещает на позицию %n в текущем буфере (истории переписки) diff -r b527e8800278 mcabber/doc/help/ru/hlp_del.txt --- a/mcabber/doc/help/ru/hlp_del.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/ru/hlp_del.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/ru/hlp_del.txt Wed Mar 13 03:21:24 2013 +0200 @@ -1,4 +1,4 @@ - /DEL @@ -355,7 +355,7 @@ +Удаляет текущего пользователя (или указанного с помощью jid) из списка контактов, отключает уведомления о его статусе и отключает уведомление пользователя о вашем статусе. diff -r b527e8800278 mcabber/doc/help/ru/hlp_move.txt --- a/mcabber/doc/help/ru/hlp_move.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/ru/hlp_move.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/ru/hlp_move.txt Wed Mar 13 03:21:24 2013 +0200 @@ -1,6 +1,7 @@ - /MOVE [groupname] @@ -367,7 +367,7 @@ diff -r b527e8800278 mcabber/doc/help/ru/hlp_rename.txt --- a/mcabber/doc/help/ru/hlp_rename.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/ru/hlp_rename.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/ru/hlp_rename.txt Wed Mar 13 03:21:24 2013 +0200 @@ -1,4 +1,6 @@ - /RENAME name @@ -379,7 +379,7 @@ +Для указания обьекта, отличного от текущего, можно использовать опции --jid, --group и --name. diff -r b527e8800278 mcabber/doc/help/uk/hlp_buffer.txt --- a/mcabber/doc/help/uk/hlp_buffer.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/uk/hlp_buffer.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/uk/hlp_buffer.txt Wed Mar 13 03:21:24 2013 +0200 @@ -25,7 +25,7 @@ Посунути буфер вверх на n рядків (якщо не вказано - пів екрану). /buffer down [n] @@ -391,7 +391,7 @@ Перейти до вказаної у процентах позиції. diff -r b527e8800278 mcabber/doc/help/uk/hlp_del.txt --- a/mcabber/doc/help/uk/hlp_del.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/uk/hlp_del.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/uk/hlp_del.txt Wed Mar 13 03:21:24 2013 +0200 @@ -1,4 +1,4 @@ - /DEL @@ -401,7 +401,7 @@ +Потерти поточний контакт (або контакт, що має вказаний jid) зі списку. Також відписатися від його сповіщень про статус і відписати його від ваших. diff -r b527e8800278 mcabber/doc/help/uk/hlp_move.txt --- a/mcabber/doc/help/uk/hlp_move.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/uk/hlp_move.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/uk/hlp_move.txt Wed Mar 13 03:21:24 2013 +0200 @@ -1,5 +1,6 @@ - /MOVE [група] @@ -413,7 +413,7 @@ Примітка: в режимі розмови можна використати "/roster alternate", щоб перейти до нового місця контакту контакту. diff -r b527e8800278 mcabber/doc/help/uk/hlp_rename.txt --- a/mcabber/doc/help/uk/hlp_rename.txt Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/doc/help/uk/hlp_rename.txt Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/doc/help/uk/hlp_rename.txt Wed Mar 13 03:21:24 2013 +0200 @@ -1,4 +1,6 @@ - /RENAME ім'я @@ -424,7 +424,7 @@ +Опції --jid, --group та --name дозволяють перейменовувати об’єкти, відмінні від поточного. diff -r b527e8800278 mcabber/mcabber/commands.c --- a/mcabber/mcabber/commands.c Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/mcabber/commands.c Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/mcabber/commands.c Wed Mar 13 03:21:24 2013 +0200 @@ -19,7 +19,7 @@ * USA */ @@ -814,8 +814,8 @@ + if (error == NULL) { + gsize n; + if (command -> opts) { -+ for (n = 0; command -> opts[n] != NULL; n ++) { -+ cmdopt_t *opt = command -> opts[n]; ++ for (n = 0; command -> opts[n].shortopt != 0; n ++) { ++ cmdopt_t *opt = command -> opts + n; + if (opt -> flags & cmdopt_switch) { + opt -> arg.value.swc = 0; + } else { @@ -830,8 +830,8 @@ - return FALSE; - return TRUE; + if (command -> args) { -+ for (n = 0; command -> args[n] != NULL; n ++) { -+ cmdarg_t *arg = command -> args[n]; ++ for (n = 0; command -> args[n].name != NULL; n ++) { ++ cmdarg_t *arg = command -> args + n; + arg -> value.roarg = arg -> defval; + arg -> flags &= ~(cmdarg_ppclear); + } @@ -868,10 +868,10 @@ + } + } else if (state == in_shortoptend) { // short option + if (*p == ' ' || p == e) { // option really ended -+ gsize n; -+ for (n = 0; command -> opts[n] != NULL; n ++) { -+ if (command -> opts[n] -> shortopt == *s) { -+ option = command -> opts[n]; ++ size_t n; ++ for (n = 0; command -> opts[n].shortopt != 0; n ++) { ++ if (command -> opts[n].shortopt == *s) { ++ option = command -> opts + n; + break; + } + } @@ -909,11 +909,11 @@ + } + } else if (state == in_longopt) { // long option name + if (*p == ' ' || p == e) { // long option ended -+ gsize n; ++ size_t n; + *p = '\0'; -+ for (n = 0; command -> opts[n] != NULL; n ++) { -+ if (!g_strcmp0(command -> opts[n] -> longopt, s)) { -+ option = command -> opts[n]; ++ for (n = 0; command -> opts[n].shortopt != 0; n ++) { ++ if (!g_strcmp0(command -> opts[n].longopt, s)) { ++ option = command -> opts + n; + break; + } + } @@ -938,10 +938,10 @@ + + if (option) { // option argument + arg = &(option -> arg); -+ } else if (!command -> args || !command -> args[argno]) { // no need to parse arguments any further ++ } else if (!command -> args || !command -> args[argno].name) { // no need to parse arguments any further + break; + } else { // normal aurgument -+ arg = command -> args[argno]; ++ arg = command -> args + argno; + } + + if ((err = cmdopts_parse_argument(&p, &e, arg -> flags))) { // get argument value @@ -961,9 +961,9 @@ + if (arg -> flags & cmdarg_subcmd) { // subcommand + cmdopts_t *subcmd; + gsize n; // XXX put command list into chkdata -+ for (n = 0; command -> cmds[n]; n ++) { -+ if (!strcmp (s, command -> cmds[n] -> name)) { -+ subcmd = command -> cmds[n]; ++ for (n = 0; command -> cmds[n].name != NULL; n ++) { ++ if (!strcmp (s, command -> cmds[n].name)) { ++ subcmd = command -> cmds + n; + break; + } + } @@ -991,8 +991,8 @@ + // perform option argument checking + if (error == NULL && command -> opts) { + gsize n; -+ for (n = 0; command -> opts[n]; n ++) { -+ cmdopt_t *opt = command -> opts[n]; ++ for (n = 0; command -> opts[n].shortopt != 0; n ++) { ++ cmdopt_t *opt = command -> opts + n; + if (!(opt -> flags & cmdopt_switch)) { // not a switch + // needs checking and not checked already + if ((opt -> arg.flags & (cmdarg_check | cmdarg_visited)) && !(opt -> arg.flags & cmdarg_checked)) { @@ -1001,18 +1001,18 @@ + opt -> arg.flags |= cmdarg_checked; + if ((err = opt -> arg.type -> check (&(opt -> arg)))) { + if (opt -> arg.flags & cmdarg_required) { -+ if (opt -> shortopt) { ++ if (opt -> longopt) { ++ error = g_strdup_printf ("%s: Error in argument for option --%s: %s", command -> name, opt -> longopt, err); ++ } else { + error = g_strdup_printf ("%s: Error in argument for option -%c: %s", command -> name, opt -> shortopt, err); -+ } else { -+ error = g_strdup_printf ("%s: Error in argument for option --%s: %s", command -> name, opt -> longopt, err); + } + g_free (err); + break; + } else { -+ if (opt -> shortopt) { ++ if (opt -> longopt) { ++ scr_log_print (LPRINT_NORMAL, "Warning: %s: Error in argument for option --%s: %s", command -> name, opt -> longopt, err); ++ } else { + scr_log_print (LPRINT_NORMAL, "Warning: %s: Error in argument for option -%c: %s", command -> name, opt -> shortopt, err); -+ } else { -+ scr_log_print (LPRINT_NORMAL, "Warning: %s: Error in argument for option --%s: %s", command -> name, opt -> longopt, err); + } + g_free (err); + } @@ -1026,8 +1026,8 @@ + // perform positional argument checking + if (error == NULL && command -> args) { + size_t n; -+ for (n = 0; command -> args[n]; n ++) { -+ cmdarg_t *arg = command -> args[n]; ++ for (n = 0; command -> args[n].name != NULL; n ++) { ++ cmdarg_t *arg = command -> args + n; + // needs checking and not checked already + if ((arg -> flags & (cmdarg_check | cmdarg_visited)) && !(arg -> flags & cmdarg_checked)) { + if (arg -> flags & cmdarg_subcmd) { // subcommand @@ -1045,11 +1045,11 @@ + arg -> flags |= cmdarg_checked; + if ((err = arg -> type -> check (arg))) { + if (arg -> flags & cmdarg_required) { -+ error = g_strdup_printf ("%s: Error in argument %s (%u): %s", command -> name, arg -> name, n, err); ++ error = g_strdup_printf ("%s: Error in argument %s (%lu): %s", command -> name, arg -> name, n, err); + g_free (err); + break; + } else { // XXX more prefixes -+ scr_log_print (LPRINT_NORMAL, "Warning: %s: Error in argument %s (%u): %s", command -> name, arg -> name, n, err); ++ scr_log_print (LPRINT_NORMAL, "Warning: %s: Error in argument %s (%lu): %s", command -> name, arg -> name, n, err); + g_free (err); + } + } @@ -1078,8 +1078,8 @@ - return FALSE; + gsize n; + if (command -> opts) { -+ for (n = 0; command -> opts[n]; n ++) { -+ cmdopt_t *opt = command -> opts[n]; ++ for (n = 0; command -> opts[n].shortopt != 0; n ++) { ++ cmdopt_t *opt = command -> opts + n; + if (!(opt -> flags & cmdopt_switch)) { // not switch + if (opt -> arg.flags & cmdarg_freeme) { // can free something + opt -> arg.flags &= ~cmdarg_freeme; @@ -1091,8 +1091,8 @@ + } + } + if (command -> args) { -+ for (n = 0; command -> args[n]; n ++) { -+ cmdarg_t *arg = command -> args[n]; ++ for (n = 0; command -> args[n].name != NULL; n ++) { ++ cmdarg_t *arg = command -> args + n; + if (arg -> flags & cmdarg_subcmd) { // subcommand + if (arg -> value.cmd) { + cmdopts_free (arg -> value.cmd); @@ -1592,7 +1592,7 @@ if (!*line) { // User only pressed enter if (scr_get_multimode()) { scr_append_multiline(""); -@@ -556,141 +715,516 @@ +@@ -556,141 +715,500 @@ } if (current_buddy) { if (buddy_gettype(BUDDATA(current_buddy)) & ROSTER_TYPE_GROUP) @@ -1793,14 +1793,12 @@ + return g_strdup ("Non-space value required."); +} + -+static const cmdarg_type_t cmdarg_typedef_nonspace = { ++const cmdarg_type_t cmdarg_type_nonspace = { + cmdarg_check_nonspace, + NULL, + NULL, +}; + -+const cmdarg_type_t *cmdarg_type_nonspace = &cmdarg_typedef_nonspace; -+ +// +// bjid -> bud +// @@ -1840,14 +1838,12 @@ + return error; +} + -+static const cmdarg_type_t cmdarg_typedef_roster_bjid = { ++const cmdarg_type_t cmdarg_type_roster_bjid = { + cmdarg_check_roster_bjid, + NULL, + NULL, +}; + -+const cmdarg_type_t *cmdarg_type_roster_bjid = &cmdarg_typedef_roster_bjid; -+ +// +// fjid -> bud + resource +// @@ -1868,8 +1864,8 @@ + char *resource = NULL; + + if (!(error = cmdarg_check_nonspace(arg))) { -+ const char *fjid = arg -> value.arg; -+ guint types = (guint) arg -> chkdata; ++ char *fjid = arg -> value.arg; ++ guint types = (guint) arg -> chkdata; + + if (fjid[0] == '.' && fjid[1] == JID_RESOURCE_SEPARATOR) { + // current buddy @@ -1928,14 +1924,12 @@ + return error; +} + -+static const cmdarg_type_t cmdarg_typedef_roster_resource = { ++const cmdarg_type_t cmdarg_type_roster_resource = { + cmdarg_check_roster_resource, + NULL, + NULL, +}; + -+const cmdarg_type_t *cmdarg_type_roster_resource = &cmdarg_typedef_roster_resource; -+ +// +// fjid -> fjid +// @@ -1974,14 +1968,12 @@ + return error; +} + -+static const cmdarg_type_t cmdarg_typedef_fjid = { ++const cmdarg_type_t cmdarg_type_fjid = { + cmdarg_check_fjid, + cmdarg_free_gfree, + NULL, +}; + -+const cmdarg_type_t *cmdarg_type_fjid = &cmdarg_typedef_fjid; -+ +// +// string -> uint +// @@ -2014,14 +2006,12 @@ + return error; +} + -+static const cmdarg_type_t cmdarg_typedef_uint = { ++const cmdarg_type_t cmdarg_type_uint = { + cmdarg_check_uint, + NULL, + NULL, +}; + -+const cmdarg_type_t *cmdarg_type_uint = &cmdarg_typedef_uint; -+ +// +// string -> statusmask +// @@ -2073,14 +2063,12 @@ + return error; +} + -+static const cmdarg_type_t cmdarg_typedef_statusmask = { ++const cmdarg_type_t cmdarg_type_statusmask = { + cmdarg_check_statusmask, + cmdarg_free_gfree, + NULL, +}; + -+const cmdarg_type_t *cmdarg_type_statusmask = &cmdarg_typedef_statusmask; -+ +// +// string -> enum +// @@ -2112,14 +2100,12 @@ + return error; +} + -+static const cmdarg_type_t cmdarg_typedef_string2enum = { ++const cmdarg_type_t cmdarg_type_string2enum = { + cmdarg_check_string2enum, + NULL, + NULL, +}; + -+const cmdarg_type_t *cmdarg_type_string2enum = &cmdarg_typedef_string2enum; -+ +// +// string -> color name +// @@ -2177,14 +2163,12 @@ + return error; +} + -+static const cmdarg_type_t cmdarg_typedef_color = { ++const cmdarg_type_t cmdarg_type_color = { + cmdarg_check_color, + NULL, + NULL, +}; + -+const cmdarg_type_t *cmdarg_type_color = &cmdarg_typedef_color; -+ +// +// Command definitions +// @@ -2219,7 +2203,7 @@ static void display_and_free_note(struct annotation *note, const char *winId) { gchar tbuf[128]; -@@ -755,41 +1289,15 @@ +@@ -755,41 +1273,15 @@ g_slist_free(notes); } @@ -2269,7 +2253,7 @@ struct annotation *note = xmpp_get_storage_rosternotes(bjid, FALSE); if (note) { display_and_free_note(note, bjid); -@@ -800,194 +1308,282 @@ +@@ -800,194 +1292,293 @@ } } @@ -2294,48 +2278,52 @@ + { #NAME, cmd_default, NULL, NULL, NULL, ARGS, NULL, (gpointer)scmd_roster_##NAME } +static cmdopts_t def_roster = { + "roster", -+ cmd_default, // XXX ++ cmd_default, + NULL, + do_roster, + NULL, -+ {{"subcommand", cmdarg_subcmd | cmdarg_check, NULL, NULL}, NULL}, -+ { ++ (cmdarg_t[2]){{"subcommand", cmdarg_subcmd | cmdarg_check, NULL, NULL},{NULL}}, ++ (cmdopts_t[25]){ + SCMD_ROSTER(bottom, NULL), + SCMD_ROSTER(top, NULL), -+ SCMD_ROSTER(up, {{"n", cmdarg_chreq, "1", cmdarg_type_uint}, NULL}), -+ SCMD_ROSTER(down, {{"n", cmdarg_chreq, "1", cmdarg_type_uint}, NULL}), ++ SCMD_ROSTER(up, (cmdarg_t[2]){{"n", cmdarg_chreq, "1", &cmdarg_type_uint},{NULL}}), ++// { "up", NULL, NULL, NULL, ++// (cmdarg_t[2]){{"n", cmdarg_chreq, "1", cmdarg_type_uint},{NULL}}, ++// NULL, (gpointer)scmd_roster_up ++// } ++ SCMD_ROSTER(down, (cmdarg_t[2]){{"n", cmdarg_chreq, "1", &cmdarg_type_uint},{NULL}}), + SCMD_ROSTER(group_prev, NULL), + SCMD_ROSTER(group_next, NULL), + SCMD_ROSTER(alternate, NULL), + SCMD_ROSTER(unread_first, NULL), + SCMD_ROSTER(unread_next, NULL), -+ SCMD_ROSTER(search, {{"name", cmdarg_eol|cmdarg_required, NULL, cmdarg_type_nonspace}, NULL}), -+ SCMD_ROSTER(display, {{"statusmask", cmdarg_check, NULL, cmdarg_type_statusmask}, NULL}), ++ SCMD_ROSTER(search, (cmdarg_t[2]){{"name", cmdarg_eol|cmdarg_required, NULL, &cmdarg_type_nonspace},{NULL}}), ++ SCMD_ROSTER(display, (cmdarg_t[2]){{"statusmask", cmdarg_check, NULL, &cmdarg_type_statusmask},{NULL}}), + SCMD_ROSTER(hide_offline, NULL), + SCMD_ROSTER(show_offline, NULL), + SCMD_ROSTER(toggle_offline, NULL), -+ SCMD_ROSTER(item_lock, {{"jid", cmdarg_chreq, ".", cmdarg_type_roster_bjid, (gpointer)(ROSTER_TYPE_USER|ROSTER_TYPE_ROOM)}, NULL}), -+ SCMD_ROSTER(item_unlock, {{"jid", cmdarg_chreq, ".", cmdarg_type_roster_bjid, (gpointer)(ROSTER_TYPE_USER|ROSTER_TYPE_ROOM)}, NULL}), -+ SCMD_ROSTER(item_toggle_lock, {{"jid", cmdarg_chreq, ".", cmdarg_type_roster_bjid, (gpointer)(ROSTER_TYPE_USER|ROSTER_TYPE_ROOM)}, NULL}), -+ { "note", NULL, NULL, -+ { -+ {cmdopt_switch, 'r', "reset", {"reset", cmdarg_default, NULL, NULL, NULL}}, -+ {cmdopt_default, 'j', "jid", {"jid", cmdarg_chreq, ".", cmdarg_type_roster_bjid, (gpointer)(ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT)}}, -+ NULL, ++ SCMD_ROSTER(item_lock, (cmdarg_t[2]){{"jid", cmdarg_chreq, ".", &cmdarg_type_roster_bjid, (gpointer)(ROSTER_TYPE_USER|ROSTER_TYPE_ROOM)},{NULL}}), ++ SCMD_ROSTER(item_unlock, (cmdarg_t[2]){{"jid", cmdarg_chreq, ".", &cmdarg_type_roster_bjid, (gpointer)(ROSTER_TYPE_USER|ROSTER_TYPE_ROOM)},{NULL}}), ++ SCMD_ROSTER(item_toggle_lock, (cmdarg_t[2]){{"jid", cmdarg_chreq, ".", &cmdarg_type_roster_bjid, (gpointer)(ROSTER_TYPE_USER|ROSTER_TYPE_ROOM)},{NULL}}), ++ { "note", cmd_default, NULL, NULL, ++ (cmdopt_t[3]){ ++ {'r', "reset", cmdopt_switch, {"reset", cmdarg_default, NULL, NULL, NULL}}, ++ {'j', "jid", cmdopt_default, {"jid", cmdarg_chreq, ".", &cmdarg_type_roster_bjid, (gpointer)(ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT)}}, ++ {0} + }, -+ { -+ {cmdarg_eol, NULL, cmdarg_type_nonspace}, -+ NULL, ++ (cmdarg_t[2]){ ++ {"text", cmdarg_eol, NULL, &cmdarg_type_nonspace}, ++ {NULL} + }, + NULL, (gpointer)scmd_roster_note + }, + SCMD_ROSTER(notes, NULL), -+ SCMD_ROSTER(resource_lock, {{"resource|fjid", cmdarg_chreq, NULL, cmdarg_type_roster_resource, (gpointer)(ROSTER_TYPE_USER|ROSTER_TYPE_AGENT)}, NULL}), -+ SCMD_ROSTER(resource_unlock, {{"jid", cmdarg_chreq, ".", cmdarg_type_roster_bjid, (gpointer)(ROSTER_TYPE_USER|ROSTER_TYPE_AGENT)}, NULL}), ++ SCMD_ROSTER(resource_lock, (cmdarg_t[2]){{"resource|fjid", cmdarg_chreq, NULL, &cmdarg_type_roster_resource, (gpointer)(ROSTER_TYPE_USER|ROSTER_TYPE_AGENT)},{NULL}}), ++ SCMD_ROSTER(resource_unlock, (cmdarg_t[2]){{"jid", cmdarg_chreq, ".", &cmdarg_type_roster_bjid, (gpointer)(ROSTER_TYPE_USER|ROSTER_TYPE_AGENT)},{NULL}}), + SCMD_ROSTER(hide, NULL), + SCMD_ROSTER(show, NULL), + SCMD_ROSTER(toggle, NULL), -+ NULL, ++ {NULL} + }, +}; + @@ -2372,11 +2360,11 @@ - } - - if (!strcasecmp(subcmd, "top")) { -+ scmd_roster_t subcmd = (scmd_roster_t) (options -> args[0] -> value.cmd -> userdata); ++ scmd_roster_t subcmd = (scmd_roster_t) (options -> args[0].value.cmd -> userdata); + cmdarg_t *arg = NULL; + -+ if (options -> args[0] -> value.cmd -> args) -+ arg = options -> args[0] -> value.cmd -> args[0]; ++ if (options -> args[0].value.cmd -> args[0].name) ++ arg = options -> args[0].value.cmd -> args; + + if (subcmd == scmd_roster_bottom) { + scr_roster_bottom(); @@ -2475,8 +2463,8 @@ + } else if (subcmd == scmd_roster_item_toggle_lock) { + roster_buddylock(arg -> value.bud, -1); + } else if (subcmd == scmd_roster_note) { -+ roster_note(options -> cmds[18] -> opts[1] -> value.bud, -+ options -> cmds[18] -> opts[0] -> value.swc, ++ roster_note(options -> cmds[18].opts[1].arg.value.bud, ++ options -> cmds[18].opts[0].arg.value.swc, + arg -> value.arg); + } else if (subcmd == scmd_roster_notes) { + display_all_annotations(); @@ -2524,7 +2512,7 @@ + return cmdarg_check_statusmask (arg); +} + -+static const cmdarg_type_t cmdarg_typedef_color_statusmask = { ++static const cmdarg_type_t cmdarg_type_color_statusmask = { + cmdarg_check_color_statusmask, + NULL, + NULL, @@ -2558,14 +2546,21 @@ + return error; +} + -+static const cmdarg_type_t *cmdarg_type_color_roomjid = { ++static const cmdarg_type_t cmdarg_type_color_roomjid = { + cmdarg_check_color_roomjid, + NULL, + NULL, +}; + +// TODO: completion, that says, which roster jids do match -+static const cmdarg_type_t *cmdarg_type_bjidmask = { ++static const cmdarg_type_t cmdarg_type_bjidmask = { ++ cmdarg_check_nonspace, ++ NULL, ++ NULL, ++}; ++ ++// TODO: completion, based on current room nicks ++static const cmdarg_type_t cmdarg_type_nick = { + cmdarg_check_nonspace, + NULL, + NULL, @@ -2589,40 +2584,40 @@ + +static cmdopts_t def_color = { + "color", -+ cmd_default, // XXX ++ cmd_safe, + NULL, + do_color, + NULL, -+ {{ "subcommand", cmdarg_subcmd | cmdarg_check, NULL, NULL }, NULL}, -+ { -+ {"roster", NULL, NULL, NULL, { -+ { "statusmask|clear", cmdarg_chreq, NULL, &cmdarg_type_color_statusmask }, -+ { "jidmask", cmdarg_default, NULL, &cmdarg_type_bjidmask }, -+ { "color|-", cmdarg_default, NULL, cmdarg_type_color }, -+ NULL, ++ (cmdarg_t[2]){{ "subcommand", cmdarg_subcmd | cmdarg_check, NULL, NULL },{NULL}}, ++ (cmdopts_t[4]){ ++ {"roster", cmd_default, NULL, NULL, NULL, (cmdarg_t[4]){ ++ { "statusmask|clear", cmdarg_chreq, NULL, &cmdarg_type_color_statusmask }, ++ { "jidmask", cmdarg_default, NULL, &cmdarg_type_bjidmask }, ++ { "color|-", cmdarg_default, NULL, &cmdarg_type_color }, ++ {NULL} + }, NULL, (gpointer)scmd_color_roster}, -+ {"muc", NULL, NULL, NULL, { -+ { "roomjid", cmdarg_chreq, NULL, &cmdarg_type_color_roomjid }, -+ { "on|off|preset|-", cmdarg_chreq, "on", cmdarg_type_string2enum, (gpointer)s2e_color_muc}, -+ NULL, ++ {"muc", cmd_default, NULL, NULL, NULL, (cmdarg_t[3]){ ++ { "roomjid", cmdarg_chreq, NULL, &cmdarg_type_color_roomjid }, ++ { "on|off|preset|-", cmdarg_chreq, "on", &cmdarg_type_string2enum, (gpointer)s2e_color_muc}, ++ {NULL} + }, NULL, (gpointer)scmd_color_muc}, -+ {"mucnick", NULL, NULL, NULL { -+ { "nick", cmdarg_chreq, NULL, cmdarg_type_nick }, -+ { "color|-", cmdarg_chreq, NULL, cmdarg_type_color }, -+ NULL, ++ {"mucnick", cmd_default, NULL, NULL, NULL, (cmdarg_t[3]){ ++ { "nick", cmdarg_chreq, NULL, &cmdarg_type_nick }, ++ { "color|-", cmdarg_chreq, NULL, &cmdarg_type_color }, ++ {NULL} + }, NULL, (gpointer)scmd_color_mucnick}, -+ NULL, ++ {NULL} + }, +}; + +static gchar *do_color(cmdopts_t *options) +{ -+ scmd_color_t subcmd = (scmd_color_t) options -> args[0] -> value.cmd -> userdata; ++ scmd_color_t subcmd = (scmd_color_t) options -> args[0].value.cmd -> userdata; + + if (subcmd == scmd_color_roster) { -+ const gchar *status = options -> cmds[0] -> args[0] -> value.arg; -+ const gchar *wildcard = options -> cmds[0] -> args[1] -> value.arg; -+ const gchar *color = options -> cmds[0] -> args[2] -> value.arg; ++ const gchar *status = options -> cmds[0].args[0].value.arg; ++ const gchar *wildcard = options -> cmds[0].args[1].value.arg; ++ const gchar *color = options -> cmds[0].args[2].value.arg; + if (!strcmp(status, "clear")) { // Not a color command, clear all scr_roster_clear_color(); update_roster = TRUE; @@ -2680,11 +2675,11 @@ - scr_LogPrint(LPRINT_NORMAL, "Unrecognized parameter!"); - free_arg_lst(paramlst); + } else if (subcmd == scmd_color_muc) { -+ scr_muc_color ( options -> cmds[1] -> args[0] -> value.arg, -+ options -> cmds[1] -> args[1] -> value.uint ); ++ scr_muc_color ( options -> cmds[1].args[0].value.arg, ++ options -> cmds[1].args[1].value.uint ); + } else { // scmd_color_mucnick -+ scr_muc_nick_color( options -> cmds[2] -> args[0] -> value.arg, -+ options -> cmds[2] -> args[1] -> value.arg ); ++ scr_muc_nick_color( options -> cmds[2].args[0].value.arg, ++ options -> cmds[2].args[1].value.arg ); + } + + return NULL; @@ -2710,7 +2705,7 @@ enum imstatus st; if (!xmpp_is_online()) -@@ -1000,15 +1596,15 @@ +@@ -1000,15 +1591,15 @@ if (!recipient) scr_check_auto_away(TRUE); @@ -2731,7 +2726,7 @@ if (!strcasecmp(status, IMSTATUS_OFFLINE)) st = offline; else if (!strcasecmp(status, IMSTATUS_ONLINE)) st = available; else if (!strcasecmp(status, IMSTATUS_AVAILABLE)) st = available; -@@ -1020,229 +1616,351 @@ +@@ -1020,229 +1611,349 @@ else if (!strcasecmp(status, IMSTATUS_NOTAVAILABLE)) st = notavail; else if (!strcasecmp(status, IMSTATUS_FREE4CHAT)) st = freeforchat; else if (!strcasecmp(status, "message")) { @@ -2770,9 +2765,7 @@ +static gchar *cmdarg_check_status_status (cmdarg_t *arg) { - if (!*arg) { -+ gchar *error; -+ -+ if (!g_strcmp0(arg, "message")) { ++ if (!g_strcmp0(arg -> value.arg, "message")) { + arg -> value.uint = xmpp_getstatus(); // Preserve current status + return NULL; + } @@ -2804,23 +2797,23 @@ + { NULL, 0 }, +}; + -+cmdopts_t def_status = { ++static cmdopts_t def_status = { + "status", -+ cmd_default, // XXX ++ cmd_safe, + NULL, + do_status, + NULL, -+ { ++ (cmdarg_t[3]){ + {"status", cmdarg_chreq, "show", &cmdarg_type_status_status, (gpointer)s2e_status2}, -+ {"message", cmdarg_eol, NULL, cmdarg_type_nonspace}, -+ NULL, ++ {"message", cmdarg_eol, NULL, &cmdarg_type_nonspace}, ++ {NULL} + }, + NULL, +}; + +static gchar *do_status(cmdopts_t *options) +{ -+ if (options -> args[0] -> value.uint == imstatus_size) { ++ if (options -> args[0].value.uint == imstatus_size) { const char *sm = xmpp_getstatusmsg(); scr_LogPrint(LPRINT_NORMAL, "Your status is: [%c] %s", imstatus2char[xmpp_getstatus()], @@ -2829,8 +2822,8 @@ + if (!xmpp_is_online()) + scr_LogPrint(LPRINT_NORMAL, "You are currently not connected..."); + scr_check_auto_away(TRUE); -+ xmpp_setstatus(options -> args[0] -> value.uint, NULL, -+ options -> args[1] -> value.arg, FALSE); ++ xmpp_setstatus(options -> args[0].value.uint, NULL, ++ options -> args[1].value.arg, FALSE); + } + return NULL; +} @@ -2854,17 +2847,17 @@ + { NULL, 0 }, +}; + -+cmdopts_t def_status_to = { ++static cmdopts_t def_status_to = { + "status_to", -+ cmd_default, // XXX ++ cmd_default, + NULL, + do_status_to, + NULL, -+ { -+ {"jid", cmdarg_chreq, NULL, cmdarg_type_fjid}, -+ {"status", cmdarg_chreq, NULL, &cmdarg_type_status_status, (string2enum_t)s2e_status}, -+ {"message", cmdarg_eol, NULL, cmdarg_type_nonspace}, -+ NULL, ++ (cmdarg_t[4]){ ++ {"jid", cmdarg_chreq, NULL, &cmdarg_type_fjid}, ++ {"status", cmdarg_chreq, NULL, &cmdarg_type_status_status, (gpointer)s2e_status}, ++ {"message", cmdarg_eol, NULL, &cmdarg_type_nonspace}, ++ {NULL} + }, + NULL, +}; @@ -2874,9 +2867,9 @@ + const char *fjid, *stname, *msg; + enum imstatus st; + -+ fjid = options -> args[0] -> value.arg; -+ st = options -> args[1] -> value.uint; -+ msg = options -> args[2] -> value.arg; ++ fjid = options -> args[0].value.arg; ++ st = options -> args[1].value.uint; ++ msg = options -> args[2].value.arg; + + { // get status name + const string2enum_t *list; @@ -2895,7 +2888,7 @@ + scr_LogPrint(LPRINT_NORMAL, "You are currently not connected..."); + xmpp_setstatus(st, fjid, msg, FALSE); + -+ return NULL ++ return NULL; +} + +#if 0 @@ -3244,7 +3237,7 @@ if (roster_elt) group = buddy_getgroup(roster_elt->data); } else { -@@ -1253,31 +1971,19 @@ +@@ -1253,31 +1964,19 @@ goto do_group_return; } @@ -3279,7 +3272,7 @@ { char *bare_jid, *rp; char *hmsg; -@@ -1285,6 +1991,7 @@ +@@ -1285,6 +1984,7 @@ gint retval = 0; int isroom; gpointer xep184 = NULL; @@ -3287,7 +3280,7 @@ if (!xmpp_is_online()) { scr_LogPrint(LPRINT_NORMAL, "You are not connected."); -@@ -1299,11 +2006,15 @@ +@@ -1299,11 +1999,15 @@ return 1; } if (check_jid_syntax((char*)fjid)) { @@ -3305,7 +3298,7 @@ // We must use the bare jid in hk_message_out() rp = strchr(fjid, JID_RESOURCE_SEPARATOR); if (rp) -@@ -1354,8 +2065,7 @@ +@@ -1354,8 +2058,7 @@ // send_message(msg, subj, type_overwrite) // Write the message in the buddy's window and send the message on // the network. @@ -3315,7 +3308,7 @@ { const char *bjid; char *jid; -@@ -1378,34 +2088,13 @@ +@@ -1378,34 +2081,13 @@ else jid = g_strdup(bjid); @@ -3352,7 +3345,7 @@ scr_set_chatmode(TRUE); scr_show_buddy_window(); -@@ -1424,80 +2113,131 @@ +@@ -1424,80 +2106,131 @@ } buddy_setflags(bud, ROSTER_FLAG_LOCK, TRUE); @@ -3533,7 +3526,7 @@ if (!scr_get_multimode()) { scr_LogPrint(LPRINT_NORMAL, "No message to send. " -@@ -1508,49 +2248,47 @@ +@@ -1508,49 +2241,47 @@ scr_set_chatmode(TRUE); scr_show_buddy_window(); @@ -3619,7 +3612,7 @@ } // load_message_from_file(filename) -@@ -1566,7 +2304,7 @@ +@@ -1566,7 +2297,7 @@ char *next_utf8_char; size_t len; @@ -3628,7 +3621,7 @@ if (!fd || fstat(fileno(fd), &buf)) { scr_LogPrint(LPRINT_LOGNORM, "Cannot open message file (%s)", filename); -@@ -1634,130 +2372,103 @@ +@@ -1634,130 +2365,103 @@ static void do_say_to(char *arg) { @@ -3815,7 +3808,7 @@ } // buffer_updown(updown, nblines) -@@ -1775,27 +2486,10 @@ +@@ -1775,27 +2479,10 @@ scr_buffer_scroll_up_down(updown, nblines); } @@ -3843,7 +3836,7 @@ t = from_iso8601(date, 0); if (t) scr_buffer_date(t); -@@ -1804,98 +2498,156 @@ +@@ -1804,98 +2491,156 @@ "not correctly formatted or invalid."); } @@ -4082,7 +4075,7 @@ } static void do_info(char *arg) -@@ -2033,29 +2785,20 @@ +@@ -2033,29 +2778,20 @@ } } @@ -4121,7 +4114,7 @@ // Enter chat mode scr_set_chatmode(TRUE); -@@ -2075,12 +2818,12 @@ +@@ -2075,12 +2811,12 @@ rstatus = buddy_getstatus(bud, p_res->data); rst_msg = buddy_getstatusmsg(bud, p_res->data); @@ -4136,7 +4129,7 @@ enum imrole role = buddy_getrole(bud, p_res->data); enum imaffiliation affil = buddy_getaffil(bud, p_res->data); bool showaffil = (affil != affil_none); -@@ -2096,12 +2839,12 @@ +@@ -2096,12 +2832,12 @@ snprintf(buffer, 4095, "[%c] %s", imstatus2char[rstatus], (char*)p_res->data); scr_WriteIncomingMessage(bjid, buffer, 0, HBB_PREFIX_INFO, 0); @@ -4151,7 +4144,7 @@ enum imrole role = buddy_getrole(bud, p_res->data); enum imaffiliation affil = buddy_getaffil(bud, p_res->data); -@@ -2145,16 +2888,69 @@ +@@ -2145,16 +2881,69 @@ static void do_rename(char *arg) { @@ -4226,7 +4219,7 @@ bjid = buddy_getjid(bud); group = buddy_getgroupname(bud); type = buddy_gettype(bud); -@@ -2162,11 +2958,13 @@ +@@ -2162,11 +2951,13 @@ if (type & ROSTER_TYPE_SPECIAL) { scr_LogPrint(LPRINT_NORMAL, "You can't rename this item."); @@ -4241,7 +4234,7 @@ return; } -@@ -2181,90 +2979,117 @@ +@@ -2181,90 +2972,117 @@ // } //} @@ -4390,7 +4383,7 @@ } else { // This is a local item, we move it without adding to roster. guint msgflag; -@@ -2276,7 +3101,7 @@ +@@ -2276,7 +3094,7 @@ msgflag = buddy_getflags(bud) & ROSTER_FLAG_MSG; if (msgflag) roster_msg_setflag(bjid, FALSE, FALSE); @@ -4399,7 +4392,7 @@ if (msgflag) roster_msg_setflag(bjid, FALSE, TRUE); if ((type & ROSTER_TYPE_ROOM) && xmpp_is_bookmarked(bjid) && -@@ -2285,8 +3110,7 @@ +@@ -2285,8 +3103,7 @@ } } @@ -4409,7 +4402,7 @@ update_roster = TRUE; } -@@ -2468,50 +3292,33 @@ +@@ -2468,50 +3285,33 @@ static void do_rawxml(char *arg) { @@ -4480,7 +4473,7 @@ } // check_room_subcommand(arg, param_needed, buddy_must_be_a_room) -@@ -2874,7 +3681,7 @@ +@@ -2874,7 +3674,7 @@ fjid_utf8 = g_strdup_printf("%s/%s", buddy_getjid(bud), nick_utf8); g_free (nick_utf8); msg = to_utf8(arg); @@ -4489,7 +4482,7 @@ g_free(fjid_utf8); g_free(msg); free_arg_lst(paramlst); -@@ -3290,6 +4097,207 @@ +@@ -3290,6 +4090,207 @@ static void do_room(char *arg) { @@ -4697,7 +4690,7 @@ char **paramlst; char *subcmd; gpointer bud; -@@ -3347,7 +4355,7 @@ +@@ -3347,7 +4348,7 @@ cmd_room_leave(bud, arg); } else if (!strcasecmp(subcmd, "names")) { if ((arg = check_room_subcommand(arg, FALSE, bud)) != NULL) @@ -4706,7 +4699,7 @@ } else if (!strcasecmp(subcmd, "nick")) { if ((arg = check_room_subcommand(arg, FALSE, bud)) != NULL) room_nick(bud, arg); -@@ -4162,5 +5170,6 @@ +@@ -4162,5 +5163,6 @@ } mcabber_set_terminate_ui(); } @@ -4715,7 +4708,7 @@ /* vim: set expandtab cindent cinoptions=>2\:2(0 sw=2 ts=2: For Vim users... */ diff -r b527e8800278 mcabber/mcabber/commands.h --- a/mcabber/mcabber/commands.h Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/mcabber/commands.h Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/mcabber/commands.h Wed Mar 13 03:21:24 2013 +0200 @@ -5,32 +5,242 @@ #include @@ -4831,24 +4824,24 @@ + cmd_flags_t flags; // [user,req] safe + cmd_checker_t check; // [user,req] checker routine + cmd_handler_t handle; // [user,req] main command processing function -+ cmdopt_t **opts; // [user,req] options -+ cmdarg_t **args; // [user,req] arguments -+ cmdopts_t **cmds; // [user,req] subcommands ++ cmdopt_t *opts; // [user,req] options ++ cmdarg_t *args; // [user,req] arguments ++ cmdopts_t *cmds; // [user,req] subcommands + gpointer userdata; // [user] +}; +struct cmdarg_struct { + const char *name; // [user,req] argument name - errors, help + cmdarg_flags_t flags; // [user,req] catchall, plain, required, subcommand + const char *defval; // [user,req] default value -+ cmdarg_type_t *type; // [user,req] type cbs - checker and completor ++ const cmdarg_type_t *type; // [user,req] type cbs - checker and completor + gpointer chkdata; // [user] instance data for type checker - eg string2enum list + gpointer userdata; // [user] + cmdarg_value_t value; // [parser,chk] current value +}; +struct cmdopt_struct { -+ cmdopt_flags_t flags; // [user,req] switch + char shortopt; // [user,req] + const char *longopt; // [user,req] ++ cmdopt_flags_t flags; // [user,req] switch + cmdarg_t arg; // [user,req] +}; + @@ -4933,14 +4926,14 @@ +gchar *cmdarg_check_statusmask (cmdarg_t *arg); +gchar *cmdarg_check_string2enum (cmdarg_t *arg); + -+const cmdarg_type_t *cmdarg_type_nonspace; -+const cmdarg_type_t *cmdarg_type_roster_bjid; -+const cmdarg_type_t *cmdarg_type_roster_resource; -+const cmdarg_type_t *cmdarg_type_fjid; -+const cmdarg_type_t *cmdarg_type_uint; -+const cmdarg_type_t *cmdarg_type_statusmask; -+const cmdarg_type_t *cmdarg_type_string2enum; -+const cmdarg_type_t *cmdarg_type_color; ++const cmdarg_type_t cmdarg_type_nonspace; ++const cmdarg_type_t cmdarg_type_roster_bjid; ++const cmdarg_type_t cmdarg_type_roster_resource; ++const cmdarg_type_t cmdarg_type_fjid; ++const cmdarg_type_t cmdarg_type_uint; ++const cmdarg_type_t cmdarg_type_statusmask; ++const cmdarg_type_t cmdarg_type_string2enum; ++const cmdarg_type_t cmdarg_type_color; + +// +// Private @@ -4981,7 +4974,7 @@ diff -r b527e8800278 mcabber/mcabber/roster.c --- a/mcabber/mcabber/roster.c Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/mcabber/roster.c Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/mcabber/roster.c Wed Mar 13 03:21:24 2013 +0200 @@ -1586,13 +1586,14 @@ // Look for a buddy whose name or jid contains string. // Search begins at current_buddy; if no match is found in the the buddylist, @@ -5022,7 +5015,7 @@ } diff -r b527e8800278 mcabber/mcabber/screen.c --- a/mcabber/mcabber/screen.c Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/mcabber/screen.c Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/mcabber/screen.c Wed Mar 13 03:21:24 2013 +0200 @@ -3630,7 +3630,7 @@ { scr_check_auto_away(TRUE); @@ -5034,7 +5027,7 @@ scr_cmdhisto_addline(inputLine); diff -r b527e8800278 mcabber/mcabber/xmpp_iq.c --- a/mcabber/mcabber/xmpp_iq.c Mon Mar 11 21:45:31 2013 +0200 -+++ b/mcabber/mcabber/xmpp_iq.c Tue Mar 12 01:21:22 2013 +0200 ++++ b/mcabber/mcabber/xmpp_iq.c Wed Mar 13 03:21:24 2013 +0200 @@ -289,10 +289,7 @@ if (value) { for (s = adhoc_status_list; !s->name || strcmp(s->name, value); s++);