File: funadd.c

package info (click to toggle)
icmake 6.22-2
  • links: PTS
  • area: main
  • in suites: woody
  • size: 2,120 kB
  • ctags: 1,045
  • sloc: ansic: 9,241; makefile: 1,138; asm: 126; sh: 124
file content (61 lines) | stat: -rw-r--r-- 1,337 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/*
\funcref{fun\_add}{void fun\_add ()}
    {}
    {}
    {pop(), xstrdup(), copylist(), addtolist(), discard()}
    {}
    {funadd.c}
    {

        Function {\em fun\_add()} processes opcode {\em op\_add}. Two variables
        are popped and added. Depending on their type, two integer values are
        added, two strings are concatenated, or two lists are merged.

        The result of the addition is stored in a temporary variable, which is
        then pushed.

        The two popped variables are discarded after use.

    }
*/

#include "icm-exec.h"

void fun_add ()
{
    VAR_
        tmp,
        lval,
        rval;
    register unsigned
        i;
    register LIST_
        *rlist;

    rval = pop ();
    lval = pop ();

    if (lval.type & e_str)
    {
        tmp = newvar (e_str);
        tmp.vu.i->ls.str =
            xstrcat (xstrdup (lval.vu.i->ls.str), rval.vu.i->ls.str);
    }
    else if (lval.type & e_int)
    {
        tmp.type = e_int;
        tmp.vu.intval = lval.vu.intval + rval.vu.intval;
    }
    else
    {
        tmp = copylist (lval);
        rlist = &(rval.vu.i->ls.list);
        for (i = 0; i < rlist->size; i++)
            if (! inlist (tmp, rlist->element [i]) )
                tmp = addtolist (tmp, rlist->element [i]);
    }

    push (tmp);
    discard (lval);
    discard (rval);
}