yaubil.c
author Myhailo Danylenko <isbear@ukrpost.net>
Fri, 15 Jan 2010 15:44:00 +0200
changeset 4 faaed3ae3fa8
parent 2 6a47079725da
child 8 2033d1c5d226
permissions -rw-r--r--
String head and tail operators * : string head * ^ string tail * fix for negative integer detection
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     1
/*
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     2
 * yaubil.c             -- Yet Another Useless Built-In Language
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     3
 *
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     4
 * Copyrigth (C) 2009      Myhailo Danylenko <isbear@ukrpost.net>
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     5
 *
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     6
 * This program is free software; you can redistribute it and/or modify
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     7
 * it under the terms of the GNU General Public License as published by
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     8
 * the Free Software Foundation; either version 2 of the License, or (at
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     9
 * your option) any later version.
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    10
 *
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    11
 * This program is distributed in the hope that it will be useful, but
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    12
 * WITHOUT ANY WARRANTY; without even the implied warranty of
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    14
 * General Public License for more details.
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    15
 *
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    17
 * along with this program; if not, write to the Free Software
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    18
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    19
 * USA
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    20
 */
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    21
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    22
#include <glib.h>
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    23
#include <gmodule.h>
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    24
#include <string.h>
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    25
2
6a47079725da Change mcabber headers naming convention
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
    26
#include <mcabber/commands.h>
6a47079725da Change mcabber headers naming convention
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
    27
#include <mcabber/compl.h>
6a47079725da Change mcabber headers naming convention
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
    28
#include <mcabber/logprint.h>
6a47079725da Change mcabber headers naming convention
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
    29
#include <mcabber/settings.h>
0
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    30
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    31
static gboolean ifresult = TRUE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    32
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    33
#define MSGPREFIX "yaubil: "
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    34
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    35
#define TYPE_UNDEF ( 0 )
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    36
#define TYPE_STR   ( 1 )
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    37
#define TYPE_INT   ( 2 )
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    38
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    39
#define STATE_LVALUE ( 1 )
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    40
#define STATE_OP     ( 2 )
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    41
#define STATE_RVALUE ( 3 )
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    42
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    43
typedef struct {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    44
	int   type;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    45
	int   int_value;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    46
	char *str_value;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    47
} value_t;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    48
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    49
typedef struct {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    50
	char op;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    51
	gboolean (*handler) (value_t *l, value_t *r);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    52
} op_t;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    53
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    54
static int check_value_type (const char *value)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    55
{
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    56
	if (value) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    57
		const char *e;
4
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
    58
		gboolean    integer = (*value == '-') ? TRUE : (g_ascii_isdigit (*value) ? TRUE : FALSE);
0
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    59
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    60
		if (integer) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    61
			for (e = value + 1; *e; ++e) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    62
				if (g_ascii_isdigit (*e))
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    63
					integer = TRUE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    64
				else {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    65
					integer = FALSE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    66
					break;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    67
				}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    68
			}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    69
		}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    70
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    71
		if (integer)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    72
			return TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    73
		else
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    74
			return TYPE_STR;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    75
	} else
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    76
		return TYPE_UNDEF;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    77
}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    78
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    79
static gboolean op_concat (value_t *l, value_t *r)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    80
{
4
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
    81
	GString *res = g_string_new (NULL);
0
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    82
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    83
	if (l->type == TYPE_INT)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    84
		g_string_append_printf (res, "%d", l->int_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    85
	else if (l->type == TYPE_STR)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    86
		g_string_append (res, l->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    87
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    88
	if (r->type == TYPE_INT)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    89
		g_string_append_printf (res, "%d", r->int_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    90
	else if (r->type == TYPE_STR)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    91
		g_string_append (res, r->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    92
	
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    93
	l->type = TYPE_STR;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    94
	g_free (l->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    95
	l->str_value = g_string_free (res, FALSE);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    96
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    97
	return TRUE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    98
}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    99
4
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   100
static gboolean op_head (value_t *l, value_t *r)
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   101
{
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   102
	if (l->type == TYPE_UNDEF) {
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   103
		l->type      = TYPE_INT;
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   104
		l->int_value = 0;
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   105
	}
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   106
	if (r->type == TYPE_UNDEF) {
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   107
		r->type      = TYPE_INT;
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   108
		r->int_value = 0;
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   109
	}
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   110
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   111
	if (l -> type == TYPE_INT) {
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   112
		l -> type = TYPE_STR;
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   113
		if (!l -> str_value)
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   114
			l -> str_value = g_strdup_printf ("%d", l -> int_value);
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   115
	}
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   116
	if (r->type == TYPE_STR && check_value_type (r->str_value) == TYPE_INT) {
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   117
		r->type      = TYPE_INT;
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   118
		r->int_value = atoi (r->str_value);
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   119
		g_free (r->str_value);
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   120
		r->str_value = NULL;
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   121
	}
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   122
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   123
	if (l->type == TYPE_STR && r->type == TYPE_INT) {
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   124
		gchar *res = NULL;
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   125
		int    len = l -> str_value ? strlen (l -> str_value) : 0; // XXX can str_value be NULL?
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   126
		int    off = r -> int_value;
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   127
		if (off < 0 && len + off > 0)
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   128
			res = g_strndup (l -> str_value, len + off);
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   129
		else if (off > 0 && len > off)
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   130
			res = g_strndup (l -> str_value, off);
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   131
		else
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   132
			res = g_strdup (""); // XXX leave NULL here?
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   133
		g_free (l->str_value);
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   134
		l->str_value = res;
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   135
	} else
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   136
		return FALSE;
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   137
}
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   138
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   139
static gboolean op_tail (value_t *l, value_t *r)
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   140
{
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   141
	if (l->type == TYPE_UNDEF) {
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   142
		l->type      = TYPE_INT;
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   143
		l->int_value = 0;
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   144
	}
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   145
	if (r->type == TYPE_UNDEF) {
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   146
		r->type      = TYPE_INT;
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   147
		r->int_value = 0;
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   148
	}
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   149
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   150
	if (l -> type == TYPE_INT) {
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   151
		l -> type = TYPE_STR;
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   152
		if (!l -> str_value)
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   153
			l -> str_value = g_strdup_printf ("%d", l -> int_value);
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   154
	}
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   155
	if (r->type == TYPE_STR && check_value_type (r->str_value) == TYPE_INT) {
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   156
		r->type      = TYPE_INT;
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   157
		r->int_value = atoi (r->str_value);
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   158
		g_free (r->str_value);
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   159
		r->str_value = NULL;
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   160
	}
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   161
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   162
	if (l->type == TYPE_STR && r->type == TYPE_INT) {
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   163
		gchar *res = NULL;
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   164
		int    len = l -> str_value ? strlen (l -> str_value) : 0; // XXX can str_value be NULL?
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   165
		int    off = r -> int_value;
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   166
		if (off < 0 && len + off > 0)
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   167
			res = g_strdup (l -> str_value + (-off));
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   168
		else if (off > 0 && len > off)
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   169
			res = g_strdup (l -> str_value + (len - off));
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   170
		else
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   171
			res = g_strdup (""); // XXX leave NULL here?
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   172
		g_free (l->str_value);
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   173
		l->str_value = res;
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   174
	} else
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   175
		return FALSE;
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   176
}
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   177
0
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   178
static gboolean op_plus (value_t *l, value_t *r)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   179
{
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   180
	if (l->type == TYPE_UNDEF) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   181
		l->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   182
		l->int_value = 0;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   183
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   184
	if (r->type == TYPE_UNDEF) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   185
		r->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   186
		r->int_value = 0;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   187
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   188
	
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   189
	if (l->type == TYPE_STR && check_value_type (l->str_value) == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   190
		l->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   191
		l->int_value = atoi (l->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   192
		// not free value here
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   193
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   194
	if (r->type == TYPE_STR && check_value_type (r->str_value) == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   195
		r->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   196
		r->int_value = atoi (r->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   197
		// not free value here
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   198
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   199
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   200
	if (l->type == TYPE_INT && r->type == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   201
		// integer
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   202
		l->int_value += r->int_value;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   203
		g_free (l->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   204
		l->str_value = NULL;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   205
		g_free (r->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   206
		r->str_value = NULL;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   207
	} else {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   208
		// convert both to strings
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   209
		if (l->type == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   210
			l->type = TYPE_STR;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   211
			if (!l->str_value)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   212
				l->str_value = g_strdup_printf ("%d", l->int_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   213
		}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   214
		if (r->type == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   215
			r->type = TYPE_STR;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   216
			if (!r->str_value)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   217
				r->str_value = g_strdup_printf ("%d", r->int_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   218
		}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   219
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   220
		{
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   221
			char *tmp = l->str_value;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   222
			l->str_value = g_strdup_printf ("%s%s", tmp, r->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   223
			g_free (tmp);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   224
		}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   225
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   226
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   227
	return TRUE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   228
}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   229
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   230
static gboolean op_minus (value_t *l, value_t *r)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   231
{
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   232
	if (l->type == TYPE_UNDEF) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   233
		l->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   234
		l->int_value = 0;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   235
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   236
	if (r->type == TYPE_UNDEF) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   237
		r->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   238
		r->int_value = 0;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   239
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   240
	
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   241
	if (l->type == TYPE_STR && check_value_type (l->str_value) == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   242
		l->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   243
		l->int_value = atoi (l->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   244
		g_free (l->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   245
		l->str_value = NULL;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   246
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   247
	if (r->type == TYPE_STR && check_value_type (r->str_value) == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   248
		r->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   249
		r->int_value = atoi (r->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   250
		g_free (r->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   251
		r->str_value = NULL;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   252
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   253
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   254
	if (l->type == TYPE_INT && r->type == TYPE_INT)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   255
		l->int_value -= r->int_value;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   256
	else
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   257
		return FALSE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   258
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   259
	return TRUE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   260
}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   261
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   262
static gboolean op_multiply (value_t *l, value_t *r)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   263
{
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   264
	if (l->type == TYPE_UNDEF) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   265
		l->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   266
		l->int_value = 0;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   267
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   268
	if (r->type == TYPE_UNDEF) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   269
		r->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   270
		r->int_value = 0;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   271
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   272
	
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   273
	if (l->type == TYPE_STR && check_value_type (l->str_value) == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   274
		l->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   275
		l->int_value = atoi (l->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   276
		// not free value here
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   277
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   278
	if (r->type == TYPE_STR && check_value_type (r->str_value) == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   279
		r->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   280
		r->int_value = atoi (r->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   281
		g_free (r->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   282
		r->str_value = NULL;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   283
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   284
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   285
	if (l->type == TYPE_INT && r->type == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   286
		l->int_value *= r->int_value;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   287
		g_free (l->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   288
		l->str_value = NULL;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   289
	} else if (r->type == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   290
		GString *res = g_string_new (NULL);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   291
		int      i;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   292
		for (i = r->int_value; i; --i)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   293
			g_string_append (res, l->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   294
		g_free (l->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   295
		l->str_value = g_string_free (res, FALSE);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   296
	} else
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   297
		return FALSE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   298
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   299
	return TRUE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   300
}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   301
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   302
static gboolean op_divide (value_t *l, value_t *r)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   303
{
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   304
	if (l->type == TYPE_UNDEF) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   305
		l->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   306
		l->int_value = 0;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   307
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   308
	if (r->type == TYPE_UNDEF) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   309
		r->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   310
		r->int_value = 0;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   311
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   312
	
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   313
	if (l->type == TYPE_STR && check_value_type (l->str_value) == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   314
		l->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   315
		l->int_value = atoi (l->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   316
		g_free (l->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   317
		l->str_value = NULL;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   318
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   319
	if (r->type == TYPE_STR && check_value_type (r->str_value) == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   320
		r->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   321
		r->int_value = atoi (r->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   322
		g_free (r->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   323
		r->str_value = NULL;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   324
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   325
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   326
	if (l->type == TYPE_INT && r->type == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   327
		if (r->int_value == 0) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   328
			scr_LogPrint (LPRINT_NORMAL, MSGPREFIX "/: Error: division by zero.");
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   329
			return FALSE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   330
		}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   331
		l->int_value /= r->int_value;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   332
	} else
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   333
		return FALSE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   334
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   335
	return TRUE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   336
}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   337
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   338
static gboolean op_remain (value_t *l, value_t *r)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   339
{
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   340
	if (l->type == TYPE_UNDEF) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   341
		l->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   342
		l->int_value = 0;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   343
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   344
	if (r->type == TYPE_UNDEF) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   345
		r->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   346
		r->int_value = 0;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   347
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   348
	
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   349
	if (l->type == TYPE_STR && check_value_type (l->str_value) == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   350
		l->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   351
		l->int_value = atoi (l->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   352
		g_free (l->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   353
		l->str_value = NULL;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   354
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   355
	if (r->type == TYPE_STR && check_value_type (r->str_value) == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   356
		r->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   357
		r->int_value = atoi (r->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   358
		g_free (r->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   359
		r->str_value = NULL;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   360
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   361
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   362
	if (l->type == TYPE_INT && r->type == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   363
		if (r->int_value == 0) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   364
			scr_LogPrint (LPRINT_NORMAL, MSGPREFIX "%%: Error: division by zero.");
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   365
			return FALSE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   366
		}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   367
		l->int_value %= r->int_value;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   368
	} else
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   369
		return FALSE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   370
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   371
	return TRUE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   372
}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   373
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   374
static gboolean op_equal (value_t *l, value_t *r)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   375
{
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   376
	if (l->type == TYPE_UNDEF) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   377
		l->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   378
		l->int_value = 0;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   379
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   380
	if (r->type == TYPE_UNDEF) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   381
		r->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   382
		r->int_value = 0;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   383
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   384
	
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   385
	if (l->type == TYPE_STR && check_value_type (l->str_value) == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   386
		l->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   387
		l->int_value = atoi (l->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   388
		// not free value here
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   389
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   390
	if (r->type == TYPE_STR && check_value_type (r->str_value) == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   391
		r->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   392
		r->int_value = atoi (r->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   393
		// not free value here
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   394
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   395
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   396
	if (l->type == TYPE_INT && r->type == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   397
		// integer
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   398
		l->int_value = (l->int_value == r->int_value) ? 1 : 0;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   399
		g_free (l->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   400
		l->str_value = NULL;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   401
		g_free (r->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   402
		r->str_value = NULL;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   403
	} else {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   404
		// convert both to strings
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   405
		if (l->type == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   406
			l->type = TYPE_STR;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   407
			if (!l->str_value)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   408
				l->str_value = g_strdup_printf ("%d", l->int_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   409
		}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   410
		if (r->type == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   411
			r->type = TYPE_STR;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   412
			if (!r->str_value)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   413
				r->str_value = g_strdup_printf ("%d", r->int_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   414
		}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   415
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   416
		{
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   417
			char *tmp = l->str_value;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   418
			l->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   419
			l->int_value = (g_strcmp0 (l->str_value, r->str_value) == 0) ? 1 : 0;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   420
			g_free (tmp);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   421
		}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   422
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   423
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   424
	return TRUE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   425
}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   426
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   427
static gboolean op_lt (value_t *l, value_t *r)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   428
{
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   429
	if (l->type == TYPE_UNDEF) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   430
		l->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   431
		l->int_value = 0;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   432
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   433
	if (r->type == TYPE_UNDEF) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   434
		r->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   435
		r->int_value = 0;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   436
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   437
	
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   438
	if (l->type == TYPE_STR && check_value_type (l->str_value) == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   439
		l->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   440
		l->int_value = atoi (l->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   441
		// not free value here
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   442
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   443
	if (r->type == TYPE_STR && check_value_type (r->str_value) == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   444
		r->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   445
		r->int_value = atoi (r->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   446
		// not free value here
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   447
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   448
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   449
	if (l->type == TYPE_INT && r->type == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   450
		// integer
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   451
		l->int_value = (l->int_value < r->int_value) ? 1 : 0;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   452
		g_free (l->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   453
		l->str_value = NULL;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   454
		g_free (r->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   455
		r->str_value = NULL;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   456
	} else {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   457
		// convert both to strings
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   458
		if (l->type == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   459
			l->type = TYPE_STR;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   460
			if (!l->str_value)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   461
				l->str_value = g_strdup_printf ("%d", l->int_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   462
		}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   463
		if (r->type == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   464
			r->type = TYPE_STR;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   465
			if (!r->str_value)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   466
				r->str_value = g_strdup_printf ("%d", r->int_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   467
		}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   468
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   469
		{
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   470
			char *tmp = l->str_value;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   471
			l->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   472
			l->int_value = (g_strcmp0 (l->str_value, r->str_value) < 0) ? 1 : 0;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   473
			g_free (tmp);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   474
		}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   475
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   476
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   477
	return TRUE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   478
}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   479
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   480
static gboolean op_gt (value_t *l, value_t *r)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   481
{
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   482
	if (l->type == TYPE_UNDEF) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   483
		l->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   484
		l->int_value = 0;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   485
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   486
	if (r->type == TYPE_UNDEF) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   487
		r->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   488
		r->int_value = 0;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   489
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   490
	
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   491
	if (l->type == TYPE_STR && check_value_type (l->str_value) == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   492
		l->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   493
		l->int_value = atoi (l->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   494
		// not free value here
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   495
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   496
	if (r->type == TYPE_STR && check_value_type (r->str_value) == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   497
		r->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   498
		r->int_value = atoi (r->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   499
		// not free value here
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   500
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   501
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   502
	if (l->type == TYPE_INT && r->type == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   503
		// integer
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   504
		l->int_value = (l->int_value > r->int_value) ? 1 : 0;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   505
		g_free (l->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   506
		l->str_value = NULL;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   507
		g_free (r->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   508
		r->str_value = NULL;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   509
	} else {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   510
		// convert both to strings
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   511
		if (l->type == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   512
			l->type = TYPE_STR;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   513
			if (!l->str_value)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   514
				l->str_value = g_strdup_printf ("%d", l->int_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   515
		}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   516
		if (r->type == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   517
			r->type = TYPE_STR;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   518
			if (!r->str_value)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   519
				r->str_value = g_strdup_printf ("%d", r->int_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   520
		}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   521
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   522
		{
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   523
			char *tmp = l->str_value;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   524
			l->type      = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   525
			l->int_value = (g_strcmp0 (l->str_value, r->str_value) > 0) ? 1 : 0;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   526
			g_free (tmp);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   527
		}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   528
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   529
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   530
	return TRUE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   531
}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   532
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   533
static op_t operators[] = {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   534
	{ '.', op_concat   },
4
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   535
	{ ':', op_head     },
faaed3ae3fa8 String head and tail operators
Myhailo Danylenko <isbear@ukrpost.net>
parents: 2
diff changeset
   536
	{ '^', op_tail     },
0
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   537
	{ '+', op_plus     },
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   538
	{ '-', op_minus    },
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   539
	{ '*', op_multiply },
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   540
	{ '/', op_divide   },
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   541
	{ '%', op_remain   },
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   542
	{ '=', op_equal    },
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   543
	{ '<', op_lt       },
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   544
	{ '>', op_gt       },
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   545
	{ 0,   NULL        },
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   546
};
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   547
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   548
static void destroy_value (value_t *value)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   549
{
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   550
	if (value->str_value)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   551
		g_free (value->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   552
	g_free (value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   553
}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   554
1
320e4393785a Parentheses now have no restrictions in strings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   555
static value_t *process_expression (const char *str, gsize *len)
0
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   556
{
1
320e4393785a Parentheses now have no restrictions in strings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   557
	const char *strend = str + *len;
0
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   558
	const char *p;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   559
	op_t       *op     = NULL;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   560
	int         state  = STATE_LVALUE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   561
	value_t     val    = {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   562
		.type      = TYPE_UNDEF,
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   563
		.int_value = 0,
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   564
		.str_value = NULL,
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   565
	};
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   566
1
320e4393785a Parentheses now have no restrictions in strings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   567
	for (p = str; *p && p < strend && *p != ')'; ++p) {
0
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   568
		switch (state) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   569
		case STATE_LVALUE:
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   570
		case STATE_RVALUE:
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   571
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   572
			if (*p == ' ')
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   573
				break;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   574
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   575
			{
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   576
				value_t rval = {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   577
					.type      = TYPE_UNDEF,
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   578
					.int_value = 0,
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   579
					.str_value = NULL,
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   580
				};
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   581
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   582
				if (g_ascii_isdigit (*p) || *p == '-') { // integer // XXX: no unary operators for now...
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   583
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   584
					const char *e;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   585
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   586
					rval.type = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   587
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   588
					for (e = p + 1; g_ascii_isdigit (*e) && e < strend; ++e); // TODO: does atoi handle 0x etc? then also allow this?
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   589
					
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   590
					{
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   591
						char *v = g_strndup (p, e - p);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   592
						rval.int_value = atoi (v);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   593
						g_free (v);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   594
					}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   595
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   596
					p = e - 1;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   597
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   598
				} else if (*p == '"') { // string
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   599
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   600
					const char *e;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   601
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   602
					rval.type = TYPE_STR;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   603
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   604
					{
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   605
						gboolean  finished = FALSE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   606
						gboolean  escape   = FALSE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   607
						GString  *v        = g_string_new (NULL);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   608
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   609
						for (e = p + 1; *e && e < strend; ++e) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   610
							switch (*e) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   611
							case '\\':
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   612
								if (!escape)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   613
									escape = TRUE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   614
								else
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   615
									escape = FALSE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   616
								break;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   617
							case '"':
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   618
								if (!escape) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   619
									finished = TRUE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   620
									break;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   621
								} else
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   622
									escape = FALSE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   623
								break;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   624
							default:
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   625
								escape = FALSE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   626
								break;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   627
							}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   628
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   629
							if (finished)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   630
								break;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   631
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   632
							if (!escape)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   633
								g_string_append_c (v, *e);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   634
						};
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   635
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   636
						if (!finished) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   637
							scr_LogPrint (LPRINT_NORMAL, MSGPREFIX "Error: Unmatched quote.");
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   638
							g_string_free (v, TRUE);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   639
							g_free (val.str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   640
							return NULL;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   641
						}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   642
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   643
						rval.str_value = g_string_free (v, FALSE);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   644
					}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   645
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   646
					p = e;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   647
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   648
				} else if (g_ascii_isalpha (*p)) { // variable (MUST start from alpha)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   649
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   650
					const char *e;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   651
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   652
					for (e = p + 1; (g_ascii_isalnum (*e) || *e == '-' || *e == '_') && e < strend; ++e);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   653
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   654
					char       *name = g_strndup (p, e - p);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   655
					const char *value = settings_opt_get (name);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   656
					g_free (name);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   657
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   658
					rval.type = check_value_type (value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   659
					if (rval.type == TYPE_INT)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   660
						rval.int_value = atoi (value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   661
					else if (rval.type == TYPE_STR)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   662
						rval.str_value = g_strdup (value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   663
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   664
					p = e - 1;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   665
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   666
				} else if (*p == '(') {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   667
					
1
320e4393785a Parentheses now have no restrictions in strings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   668
					gsize    len = strend - p - 1;
320e4393785a Parentheses now have no restrictions in strings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   669
					value_t *n   = process_expression (p + 1, &len);
320e4393785a Parentheses now have no restrictions in strings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   670
					
320e4393785a Parentheses now have no restrictions in strings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   671
					if (!n) {
320e4393785a Parentheses now have no restrictions in strings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   672
						scr_LogPrint (LPRINT_NORMAL, MSGPREFIX "Error: Error in subexpression.");
320e4393785a Parentheses now have no restrictions in strings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   673
						g_free (val.str_value);
320e4393785a Parentheses now have no restrictions in strings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   674
						return NULL;
0
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   675
					}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   676
1
320e4393785a Parentheses now have no restrictions in strings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   677
					rval.type      = n->type;
320e4393785a Parentheses now have no restrictions in strings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   678
					rval.int_value = n->int_value;
320e4393785a Parentheses now have no restrictions in strings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   679
					rval.str_value = g_strdup (n->str_value);
320e4393785a Parentheses now have no restrictions in strings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   680
					destroy_value (n);
0
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   681
1
320e4393785a Parentheses now have no restrictions in strings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   682
					p += len + 1;
0
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   683
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   684
				} else {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   685
					scr_LogPrint (LPRINT_NORMAL, MSGPREFIX "Error: unrecognized symbols.");
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   686
					g_free (val.str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   687
					return NULL;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   688
				}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   689
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   690
				if (state == STATE_RVALUE) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   691
					if (op->handler) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   692
						if (!op->handler (&val, &rval)) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   693
							scr_LogPrint (LPRINT_NORMAL, MSGPREFIX "Error: operand argument types mismatch.");
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   694
							g_free (val.str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   695
							g_free (rval.str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   696
							return NULL;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   697
						}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   698
					}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   699
					g_free (rval.str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   700
				} else {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   701
					val.type      = rval.type;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   702
					val.int_value = rval.int_value;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   703
					val.str_value = rval.str_value;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   704
				}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   705
				
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   706
				state = STATE_OP;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   707
			}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   708
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   709
			break;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   710
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   711
		case STATE_OP:
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   712
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   713
			if (*p == ' ')
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   714
				break;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   715
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   716
			{
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   717
				op_t     *operator;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   718
				gboolean  found    = FALSE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   719
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   720
				for (operator = operators; operator->op; ++operator) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   721
					if (operator->op == *p) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   722
						op    = operator;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   723
						found = TRUE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   724
						break;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   725
					}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   726
				}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   727
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   728
				if (!found) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   729
					scr_LogPrint (LPRINT_NORMAL, MSGPREFIX "Error: unknown operator.");
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   730
					g_free (val.str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   731
				}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   732
			}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   733
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   734
			state = STATE_RVALUE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   735
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   736
			break;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   737
		default:
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   738
			break;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   739
		}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   740
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   741
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   742
	{ // return value
1
320e4393785a Parentheses now have no restrictions in strings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   743
		*len = p - str;
0
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   744
		value_t *rval = g_new (value_t, 1);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   745
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   746
		rval->type      = val.type;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   747
		rval->int_value = val.int_value;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   748
		rval->str_value = val.str_value;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   749
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   750
		return rval;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   751
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   752
}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   753
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   754
static void do_eval (char *arg)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   755
{
1
320e4393785a Parentheses now have no restrictions in strings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   756
	gsize    len = strlen (arg);
320e4393785a Parentheses now have no restrictions in strings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   757
	value_t *val = process_expression (arg, &len);
0
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   758
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   759
	if (!val) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   760
		scr_LogPrint (LPRINT_NORMAL, "eval: Evaluation error.");
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   761
		return;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   762
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   763
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   764
	if (val->type == TYPE_STR)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   765
		process_command (val->str_value, TRUE);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   766
	else
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   767
		scr_LogPrint (LPRINT_NORMAL, "eval: Expression does not result in string.");
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   768
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   769
	destroy_value (val);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   770
}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   771
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   772
static void do_let (char *arg)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   773
{
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   774
	char     *varname;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   775
	value_t  *value;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   776
	int       namelen;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   777
	char     *val     = strchr (arg, '=');
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   778
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   779
	if (!val) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   780
		scr_LogPrint (LPRINT_NORMAL, "let: Syntax error: no equal sign in line.");
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   781
		return;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   782
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   783
	
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   784
	{
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   785
		char *p = val;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   786
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   787
		for (p = val - 1; p >= arg && *p == ' '; --p);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   788
		if (p < arg) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   789
			scr_LogPrint (LPRINT_NORMAL, "let: Syntax error: no destination variable name specified.");
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   790
			return;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   791
		}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   792
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   793
		namelen = p + 1 - arg;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   794
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   795
1
320e4393785a Parentheses now have no restrictions in strings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   796
	{ // evaluate expression
320e4393785a Parentheses now have no restrictions in strings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   797
		gsize len = strlen (val + 1);
320e4393785a Parentheses now have no restrictions in strings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   798
320e4393785a Parentheses now have no restrictions in strings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   799
		value = process_expression (val + 1, &len);
320e4393785a Parentheses now have no restrictions in strings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   800
	}
0
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   801
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   802
	if (!value) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   803
		scr_LogPrint (LPRINT_NORMAL, "let: Evaluation error.");
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   804
		return;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   805
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   806
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   807
	if (value->type == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   808
		value->type      = TYPE_STR;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   809
		value->str_value = g_strdup_printf ("%d", value->int_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   810
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   811
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   812
	{ // assign value
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   813
		char *varname = g_strndup (arg, namelen);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   814
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   815
		if (value->str_value)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   816
			settings_set (SETTINGS_TYPE_OPTION, varname, value->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   817
		else
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   818
			settings_del (SETTINGS_TYPE_OPTION, varname);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   819
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   820
		g_free (varname);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   821
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   822
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   823
	destroy_value (value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   824
}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   825
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   826
static void do_if (char *arg)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   827
{
1
320e4393785a Parentheses now have no restrictions in strings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   828
	gsize    len = strlen (arg);
320e4393785a Parentheses now have no restrictions in strings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   829
	value_t *val = process_expression (arg, &len);
0
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   830
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   831
	if (!val) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   832
		scr_LogPrint (LPRINT_NORMAL, "if: Evaluation error.");
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   833
		return;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   834
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   835
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   836
	if (val->type == TYPE_UNDEF) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   837
		val->type = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   838
		val->int_value = 0;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   839
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   840
	if (val->type == TYPE_STR && check_value_type (val->str_value) == TYPE_INT) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   841
		val->type = TYPE_INT;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   842
		val->int_value = atoi (val->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   843
		g_free (val->str_value);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   844
		val->str_value = NULL;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   845
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   846
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   847
	if (val->type == TYPE_INT)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   848
		ifresult = val->int_value ? TRUE : FALSE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   849
	else if (val->str_value)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   850
		ifresult = TRUE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   851
	else
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   852
		ifresult = FALSE;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   853
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   854
	destroy_value (val);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   855
}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   856
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   857
static void do_then (char *arg)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   858
{
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   859
	if (ifresult)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   860
		process_command (arg, TRUE);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   861
}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   862
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   863
static void do_else (char *arg)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   864
{
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   865
	if (!ifresult)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   866
		process_command (arg, TRUE);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   867
}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   868
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   869
static void do_multi (char *arg)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   870
{
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   871
	char *end;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   872
	char *start = arg;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   873
	
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   874
	for (end = strchr (start, ';'); end; end = strchr (start, ';')) {
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   875
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   876
		// execute command
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   877
		char *command = g_strndup (start, end - start);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   878
		process_command (command, TRUE);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   879
		g_free (command);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   880
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   881
		// skip leading spaces
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   882
		for (start = end + 1; *start == ' '; ++start);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   883
	}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   884
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   885
	if (*start)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   886
		process_command (start, TRUE);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   887
}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   888
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   889
const gchar *g_module_check_init (GModule *module)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   890
{
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   891
	cmd_add ("multi", "", COMPL_CMD, COMPL_CMD, do_multi, NULL);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   892
	cmd_add ("if", "", 0, 0, do_if, NULL);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   893
	cmd_add ("then", "", COMPL_CMD, COMPL_CMD, do_then, NULL);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   894
	cmd_add ("else", "", COMPL_CMD, COMPL_CMD, do_else, NULL);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   895
	cmd_add ("eval", "", 0, 0, do_eval, NULL);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   896
	cmd_add ("let", "", 0, 0, do_let, NULL);
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   897
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   898
	return NULL;
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   899
}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   900
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   901
void g_module_unload (GModule *module)
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   902
{
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   903
	cmd_del ("multi");
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   904
	cmd_del ("if");
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   905
	cmd_del ("then");
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   906
	cmd_del ("else");
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   907
	cmd_del ("eval");
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   908
	cmd_del ("let");
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   909
}
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   910
7707b26e82fd Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   911
/* The End */