src/lua_func.c
author Tero Marttila <terom@fixme.fi>
Mon, 04 May 2009 20:55:04 +0300
branchnew-transport
changeset 168 a58ad50911fc
parent 145 a5582e1a83da
child 199 8eb839fbabba
permissions -rw-r--r--
refactor test.c into tests/*
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#include "lua_func.h"
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#include "error.h"
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
#include <lua5.1/lauxlib.h>
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
/**
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
 * Pushes onto the stack the value at t[i]
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
 */
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
static void lua_getindex (lua_State *L, int t, int i)
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
{
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
    lua_pushinteger(L, i);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
    lua_gettable(L, t);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
}
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
/**
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
 * Pushes onto the stack either:
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
 *  * the value at t[name]
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
 *  * the value at t[index]
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
 *
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
 *  Returns the new index, or 0, if neither could be found
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
 */
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
static int lua_arg_lookup (lua_State *L, int t, const char *name, int index)
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
{
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
    // try name
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
    lua_getfield(L, t, name);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
    if (!lua_isnil(L, -1))
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
        return lua_gettop(L);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
    else
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
        lua_pop(L, 1);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
    
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
    // try index
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
    lua_getindex(L, t, index);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
    
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
    if (!lua_isnil(L, -1))
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
        return lua_gettop(L);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
    else
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
        lua_pop(L, 1);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
    
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
    // not found
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
    return 0;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
}
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
static const char *_lua_arg_string (lua_State *L, int index, const char *name, const char *def)
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
{
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
    const char *value;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
    // use default?
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
    if (lua_isnoneornil(L, index) && def != (const char *) LUA_ARG_REQUIRED)
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
        return def;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
    
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
    // value given?
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
    if ((value = lua_tostring(L, index)))
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
        return value;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
   
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
    // error
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
    luaL_error(L, "missing value for required string argument <%d:%s>", index, name); return NULL;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
}
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
static bool _lua_arg_bool (lua_State *L, int index, const char *name, int def)
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
{
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
    (void) name;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
    // use default?
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
    if (lua_isnoneornil(L, index) && def != LUA_ARG_REQUIRED)
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
        return def;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
   
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
    // value given
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
    return lua_toboolean(L, index);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
}
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
/**
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
 * Look up the arg index to use for the given index/name.
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
 *
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
 * If no value is found for the corresponding index, returns zero.
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
 */
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
static int lua_arg_index (lua_State *L, int nargs, int index, const char *name)
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
{
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
    // lookup from table?
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
    if (name && lua_istable(L, 2)) {
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
        // push the value from the field onto the stack
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
        lua_getfield(L, 2, name);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
        
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
        // no named field?
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
        if (lua_isnil(L, -1)) {
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
            lua_pop(L, 1);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
            lua_getindex(L, 2, index - 1);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
        }
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
        // no index field?
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
        if (lua_isnil(L, -1)) {
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
            lua_pop(L, 1);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
            return 0;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
        }
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
        
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
        // found either a named or indexed arg
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
        return lua_gettop(L);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
    } else if (index <= nargs) {
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
        // use the same index
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
        return index;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
    } else {
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
        // no index
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
        return 0;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
    }
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
}
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
const char *lua_arg_string (lua_State *L, int nargs, int index, const char *name, const char *def)
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
{
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
    return _lua_arg_string(L, lua_arg_index(L, nargs, index, name), name, def);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
}
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
bool lua_arg_bool (lua_State *L, int nargs, int index, const char *name, int def)
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
{
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
    return _lua_arg_bool(L, lua_arg_index(L, nargs, index, name), name, def);    
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
}
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
void lua_args_parse (lua_State *L, const struct lua_func *func, void **obj_ptr, ...)
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
{
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
    int argidx = 1, argtbl = 0, idx;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
    const struct lua_func_arg *arg;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
    va_list vargs;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
    // first, the obj argument
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   129
    if (func->type)
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   130
        *obj_ptr = lua_type_get(L, func->type, argidx++);
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
    // were we given a table of arguments?
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
    if (lua_istable(L, argidx))
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
        argtbl = argidx++;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
    // parse the args
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
    va_start(vargs, obj_ptr);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
    for (arg = func->args, idx = 1; arg->name && arg->type; arg++, idx++) {
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
        int index;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
        // map index
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
        if (!argtbl)
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
            // direct
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
            index = argidx++;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
        
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
        else
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
            // lookup from table
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
            index = lua_arg_lookup(L, argtbl, arg->name, idx);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
        
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
        // apply
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
        switch (arg->type) {
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
            case LUA_ARG_STRING:
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
                *va_arg(vargs, const char **) = _lua_arg_string(L, index, arg->name, arg->def.string);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
                break;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
            case LUA_ARG_BOOL:
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
                *va_arg(vargs, bool *) = _lua_arg_bool(L, index, arg->name, arg->def.boolean);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
                break;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
            default:
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
                NOT_REACHED();
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
        };
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
    }
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
    va_end(vargs);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
}