File: getarg.c

package info (click to toggle)
icmake 6.21-4
  • links: PTS
  • area: main
  • in suites: hamm, potato, slink
  • size: 1,964 kB
  • ctags: 1,053
  • sloc: ansic: 9,245; makefile: 1,139; sh: 141; asm: 126
file content (76 lines) | stat: -rw-r--r-- 2,322 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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/*
\fucref{getarg}{char $*$getarg (\params)}
    {
        {int} {n} {{\em n}-th argument to retrieve}
        {int} {*increment} {address of counter increment}
    }
    {argument in string format}
    {xstrdup()}
    {}
    {getarg.c}
    {

        Function {\em getarg()} can be called to retrieve arguments from the
        stack (e.g., the arguments of a {\em print()} statement) in string
        format. Parameter {\em n} specifies the argument to retrieve: 0 is the
        last pushed argument, 1 is the argument pushed before that, etc..

        Parameter {\em increment} tells the caller whether to start retrieving
        a next argument or not. In the case of a list argument, {\em getarg()}
        sets this flag to 0 while the list is not yet completely processed.

        When a list argument is processed or when the retrieved argument is not
        a list, the flag value is set to 1.

        The return value points to a string duplicate. The caller should free
        this memory when it is no longer needed.

    }
*/

#include "icm-exec.h"

char *getarg (n, flag)
int n;
int *flag;
{
    char
        convbuf [50];
    static unsigned
        listindex;
    register char
        *ret;

    *flag = 1;                              /* assume that done with args */

    if (stack [sp - n].type & e_int)        /* incase of an int.. */
    {
        listindex = 0;
        sprintf (convbuf, "%d", stack [sp - n].vu.intval);
        return (xstrdup (convbuf));
    }

    if (stack [sp - n].type & e_str)        /* incase of a string.. */
    {
        listindex = 0;
        return (xstrdup (stack [sp - n].vu.i->ls.str));
    }

                                            /* incase of a list: */
    if (! stack [sp - n].vu.i->ls.list.size)
    {
        listindex = 0;
        ret = xstrdup (nullstring);
    }
    else
    {
        ret = xstrdup (stack [sp - n].vu.i->ls.list.element [listindex]);
        listindex++;
        if (listindex < stack [sp - n].vu.i->ls.list.size)
            *flag = 0;                      /* if more elements, not done */
        else                                /* with args.. */
            listindex = 0;                  /* otherwise: returnflag = 1, */
    }                                       /* no next elements to get */

    return (ret);
}