File: funsub.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 (53 lines) | stat: -rw-r--r-- 1,121 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
/*
\funcref{fun\_sub}{void fun\_sub ()}
    {}
    {}
    {pop(), copylist(), delfromlist(), discard()}
    {}
    {funsub.c}
    {

        Function {\em fun\_sub()} processes opcode {\em op\_sub}. Two variables
        are popped and subtracted. Depending on their type, two integer values
        are subtracted or a difference between two lists is computed.

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

        The two popped variables are discarded after use.
    }
*/

#include "icm-exec.h"

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

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

    if (lval.type & e_int)
    {
        tmp.type = e_int;
        tmp.vu.intval = lval.vu.intval - rval.vu.intval;
    }
    else
    {
        tmp = copylist (lval);
        if ( (rlist = &(rval.vu.i->ls.list)) )
            for (i = 0; i < rlist->size; i++)
                tmp = delfromlist (tmp, rlist->element [i]);
    }

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