templatecmd.c
author Myhailo Danylenko <isbear@ukrpost.net>
Sun, 11 Apr 2010 22:19:46 +0300
changeset 11 32564a4369f2
parent 10 b0511d0cd16e
child 14 5d8f38cc86ac
permissions -rw-r--r--
Add info struct for stable
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     1
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     2
/* Copyright 2009 Myhailo Danylenko
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     3
 *
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     4
 * This file is part of mcabber-templatecmd
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     5
 *
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     6
 * mcabber-templatecmd is free software: you can redistribute it and/or modify
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     7
 * it under the terms of the GNU General Public License as published by
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     8
 * the Free Software Foundation, either version 2 of the License, or
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     9
 * (at your option) any later version.
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    10
 *
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    11
 * This program is distributed in the hope that it will be useful,
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    14
 * GNU General Public License for more details.
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    15
 *
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    17
 * along with this program.  If not, see <http://www.gnu.org/licenses/>. */
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    18
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    19
#include <glib.h>
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    20
#include <stdlib.h>
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    21
#include <string.h>
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    22
1
9eb794ebef85 Change mcabber headers naming scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    23
#include <mcabber/compl.h>
9eb794ebef85 Change mcabber headers naming scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    24
#include <mcabber/commands.h>
9eb794ebef85 Change mcabber headers naming scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    25
#include <mcabber/utils.h>
9eb794ebef85 Change mcabber headers naming scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    26
#include <mcabber/logprint.h>
5
c403a516dc04 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
    27
#include <mcabber/modules.h>
c403a516dc04 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
    28
6
2cc481d6b686 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
    29
#include "config.h"
2cc481d6b686 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
    30
5
c403a516dc04 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
    31
static void tcmd_init (void);
c403a516dc04 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
    32
static void tcmd_uninit (void);
c403a516dc04 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
    33
6
2cc481d6b686 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
    34
#define DESCRIPTION ( "Templated commands\nProvides command /templatecmd (and any commands, you define with it)" )
2cc481d6b686 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
    35
2cc481d6b686 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
    36
static module_info_t info_templatecmd_experimental = {
2cc481d6b686 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
    37
	.branch      = "experimental",
11
32564a4369f2 Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
    38
	.api         = 28,
6
2cc481d6b686 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
    39
	.version     = PROJECT_VERSION,
2cc481d6b686 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
    40
	.description = DESCRIPTION,
2cc481d6b686 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
    41
	.requires    = NULL,
2cc481d6b686 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
    42
	.init        = tcmd_init,
2cc481d6b686 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
    43
	.uninit      = tcmd_uninit,
2cc481d6b686 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
    44
	.next        = NULL,
2cc481d6b686 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
    45
};
2cc481d6b686 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
    46
11
32564a4369f2 Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
    47
static module_info_t info_templatecmd_dev = {
6
2cc481d6b686 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
    48
	.branch      = "dev",
9
da83916efe80 Update api versions
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
    49
	.api         = 13,
6
2cc481d6b686 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
    50
	.version     = PROJECT_VERSION,
2cc481d6b686 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
    51
	.description = DESCRIPTION,
2cc481d6b686 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
    52
	.requires    = NULL,
2cc481d6b686 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
    53
	.init        = tcmd_init,
2cc481d6b686 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
    54
	.uninit      = tcmd_uninit,
2cc481d6b686 Use new module struct with api version
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
    55
	.next        = &info_templatecmd_experimental,
5
c403a516dc04 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
    56
};
0
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    57
11
32564a4369f2 Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
    58
module_info_t info_templatecmd = {
32564a4369f2 Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
    59
	.branch      = "0.10.0",
32564a4369f2 Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
    60
	.api         = 1,
32564a4369f2 Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
    61
	.version     = PROJECT_VERSION,
32564a4369f2 Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
    62
	.description = DESCRIPTION,
32564a4369f2 Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
    63
	.requires    = NULL,
32564a4369f2 Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
    64
	.init        = tcmd_init,
32564a4369f2 Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
    65
	.uninit      = tcmd_uninit,
32564a4369f2 Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
    66
	.next        = &info_templatecmd_dev,
32564a4369f2 Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
    67
};
32564a4369f2 Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 10
diff changeset
    68
0
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    69
typedef struct {
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    70
	gchar    *name;
10
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    71
#ifdef HAVE_CMD_ID
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    72
	gpointer  id;
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    73
#endif
0
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    74
	gchar    *template;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    75
	int       maxarg;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    76
	gboolean  stararg;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    77
} tcmd_t;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    78
10
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    79
#ifdef HAVE_CMD_ID
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    80
static gpointer tcmd_cmid = NULL;
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    81
#ifdef HAVE_CMD_SAFE
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    82
static gboolean tcmd_set_safe = FALSE;
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    83
#endif
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    84
#endif
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    85
0
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    86
static GSList *template_commands = NULL;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    87
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    88
static void tcmd_callback (char *arg, gpointer udata)
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    89
{
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    90
	tcmd_t   *tcmd     = (tcmd_t *) udata;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    91
	char    **args     = NULL;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    92
	GString  *command  = g_string_new (NULL);
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    93
	char     *template = tcmd -> template;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    94
	char     *p;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    95
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    96
	if (tcmd -> maxarg > 0)
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    97
		args = split_arg (arg, tcmd -> maxarg, TRUE);
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    98
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    99
	for (p = template; *p; ++p) {
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   100
		if (*p != '$' || !*(p + 1) || !strchr ("*$0123456789", *(p + 1))) {
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   101
			g_string_append_c (command, *p);
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   102
			continue;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   103
		}
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   104
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   105
		++p;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   106
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   107
		if (*p == '*')
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   108
			g_string_append (command, arg);
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   109
		else if (*p == '$')
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   110
			g_string_append_c (command, '$');
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   111
		else {
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   112
			int argnum = atoi (p);
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   113
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   114
			if (argnum == 0)
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   115
				g_string_append (command, tcmd -> name);
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   116
			else if (args[argnum - 1])
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   117
				g_string_append (command, args[argnum - 1]);
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   118
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   119
			while (*(p + 1) && strchr ("0123456789", *(p + 1)))
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   120
				++p;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   121
		}
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   122
	}
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   123
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   124
	{
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   125
		char *cmd = g_string_free (command, FALSE);
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   126
		process_command (cmd, 1);
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   127
		g_free (cmd);
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   128
	}
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   129
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   130
	if (args)
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   131
		free_arg_lst (args);
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   132
}
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   133
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   134
static void do_templatecmd (char *arg)
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   135
{
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   136
	if (!*arg) { // list tcmds
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   137
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   138
		GSList *tel;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   139
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   140
		for (tel = template_commands; tel; tel = tel -> next) {
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   141
			tcmd_t *tcmd = (tcmd_t *) tel -> data;
7
b87a5d8cd8ad Use new scr_* functions
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   142
			scr_log_print (LPRINT_NORMAL, "Templatecmd %s = %s", tcmd -> name, tcmd -> template);
0
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   143
		}
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   144
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   145
	} else {
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   146
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   147
		char *nend = strchr (arg, '=');
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   148
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   149
		if (!nend) { // show tcmd
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   150
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   151
			GSList *tel;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   152
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   153
			for (tel = template_commands; tel; tel = tel -> next) {
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   154
				tcmd_t *tcmd = (tcmd_t *) tel -> data;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   155
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   156
				if (!strcmp (arg, tcmd -> name)) {
7
b87a5d8cd8ad Use new scr_* functions
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   157
					scr_log_print (LPRINT_NORMAL, "Templatecmd %s = %s", tcmd -> name, tcmd -> template);
0
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   158
					return;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   159
				}
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   160
			}
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   161
7
b87a5d8cd8ad Use new scr_* functions
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   162
			scr_log_print (LPRINT_NORMAL, "No template with such name.");
0
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   163
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   164
		} else if (nend == arg) // error
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   165
7
b87a5d8cd8ad Use new scr_* functions
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   166
			scr_log_print (LPRINT_NORMAL, "You must specify command name.");
0
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   167
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   168
		else { // new/modify tcmd
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   169
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   170
			GSList *tel;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   171
			tcmd_t *template_command = NULL;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   172
			char   *astart           = nend + 1;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   173
			int     len;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   174
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   175
			for (--nend; nend > arg && *nend == ' '; --nend);
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   176
			len = nend + 1 - arg;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   177
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   178
			for (tel = template_commands; tel; tel = tel -> next) {
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   179
				tcmd_t *tcmd = (tcmd_t *) tel -> data;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   180
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   181
				if (!strncmp (arg, tcmd -> name, len)) {
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   182
					template_command = tcmd;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   183
					break;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   184
				}
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   185
			}
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   186
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   187
			for (;*astart && *astart == ' '; ++astart);
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   188
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   189
			if (!*astart) { // delete tcmd
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   190
				if (template_command) {
10
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   191
#ifndef HAVE_CMD_ID
0
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   192
					cmd_del (template_command -> name);
10
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   193
#else
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   194
					if (template_command -> id)
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   195
						cmd_del (template_command -> id);
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   196
#endif
0
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   197
					template_commands = g_slist_remove (template_commands, template_command);
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   198
					g_free (template_command -> name);
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   199
					g_free (template_command -> template);
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   200
					g_free (template_command);
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   201
				}
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   202
				return;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   203
			}
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   204
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   205
			if (!template_command) {
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   206
				template_command = g_new (tcmd_t, 1);
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   207
				template_command -> name = g_strndup (arg, len);
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   208
			} else
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   209
				g_free (template_command -> template);
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   210
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   211
			template_command -> template = g_strdup (astart);
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   212
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   213
			{
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   214
				int      maxarg  = -1;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   215
				gboolean stararg = FALSE;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   216
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   217
				for (astart = strchr (astart, '$'); astart; astart = strchr (astart, '$')) {
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   218
					++astart;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   219
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   220
					if (!*astart)
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   221
						break;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   222
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   223
					if (strchr ("0123456789", *astart)) {
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   224
						int anum = atoi (astart);
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   225
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   226
						if (maxarg < anum)
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   227
							maxarg = anum;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   228
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   229
					} else if (*astart == '*')
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   230
						stararg = TRUE;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   231
				}
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   232
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   233
				template_command -> maxarg  = maxarg;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   234
				template_command -> stararg = stararg;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   235
			}
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   236
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   237
			template_commands = g_slist_append (template_commands, template_command);
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   238
10
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   239
#ifndef HAVE_CMD_ID
0
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   240
			cmd_add (template_command -> name, "", 0, 0, (void (*) (char *arg)) tcmd_callback, template_command);
10
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   241
#else
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   242
			template_command -> id = cmd_add (template_command -> name, "", 0, 0, (void (*) (char *arg)) tcmd_callback, template_command);
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   243
#endif
0
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   244
		}
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   245
	}
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   246
}
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   247
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   248
5
c403a516dc04 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   249
static void tcmd_init (void)
0
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   250
{
10
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   251
#ifndef HAVE_CMD_ID
0
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   252
	cmd_add ("templatecmd", "", COMPL_CMD, COMPL_CMD, do_templatecmd, NULL);
10
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   253
#else
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   254
	tcmd_cmid = cmd_add ("templatecmd", "", COMPL_CMD, COMPL_CMD, do_templatecmd, NULL);
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   255
#ifdef HAVE_CMD_SAFE
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   256
	tcmd_set_safe = cmd_set_safe ("templatecmd", TRUE);
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   257
#endif
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   258
#endif
0
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   259
}
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   260
5
c403a516dc04 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   261
static void tcmd_uninit (void)
0
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   262
{
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   263
	GSList *tel;
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   264
10
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   265
#ifndef HAVE_CMD_ID
0
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   266
	cmd_del ("templatecmd");
10
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   267
#else
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   268
	if (tcmd_cmid)
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   269
		cmd_del (tcmd_cmid);
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   270
#ifdef HAVE_CMD_SAFE
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   271
	if (tcmd_set_safe)
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   272
		cmd_set_safe ("templatecmd", FALSE);
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   273
#endif
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   274
#endif
0
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   275
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   276
	for (tel = template_commands; tel; tel = tel -> next) {
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   277
		tcmd_t *template_command = (tcmd_t *) tel -> data;
10
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   278
#ifndef HAVE_CMD_ID
0
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   279
		cmd_del (template_command -> name);
10
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   280
#else
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   281
		if (template_command -> id)
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   282
			cmd_del (template_command -> id);
b0511d0cd16e Use new commands interface
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   283
#endif
0
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   284
		g_free (template_command -> name);
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   285
		g_free (template_command -> template);
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   286
		g_free (template_command);
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   287
	}
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   288
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   289
	g_slist_free (template_commands);
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   290
}
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   291
1c4eb7aed6c2 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   292
/* vim: se ts=4 sw=4: */