File: callrss.c

package info (click to toggle)
icmake 6.30-3
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 2,360 kB
  • ctags: 1,415
  • sloc: ansic: 7,727; makefile: 1,465; sh: 244; asm: 126; cpp: 39
file content (93 lines) | stat: -rw-r--r-- 2,794 bytes parent folder | download
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*
                                C A L L R S S . C
*/

#include "iccomp.h"

void callrss(ESTRUC_ *e, FUNNR_ funnr, ...)
{
    register E_TYPE_
        type = e_reg | e_int;               /* default return type: intreg */
    register unsigned
        args = 1;                           /* most f()s having 1 argument */
    va_list
        marker;

    va_start(marker, funnr);

    gencode (e, op_call_rss, funnr);        /* call the function */

    switch (funnr)
    {
                                            /* 0 args, returning string */
        case f_getch:
        case f_gets:
            args--;
            type = e_str | e_reg;
        break;
                                            /* 0 args, returning int */
        case f_getpid:
            args--;
            type = e_int | e_reg;
        break;
                                            /* 1 arg, returning string */
        case f_ascii_str:
        case f_g_base:
        case f_g_ext:
        case f_g_path:
            type = e_str | e_reg;
        break;
                                            /* 2 arguments, returning int */
        case f_system:
            args++;
        break;
                                            /* 2 args, returning string */
        case f_chdir:
        case f_c_base:
        case f_c_ext:
        case f_c_path:
        case f_str_el:
        case f_element:
            args++;                         /* two arguments */
            type = e_str | e_reg;           /* returning string */
        break;

                                            /* 2 args, returning list */
        case f_stat:
        case f_fgets:                       /* list fgets(string, int) */
        case f_fields:                      /* list fields(string, string) */
        case f_makelist:                    /* list makelist(int, string)  */
            args++;
            type = e_list | e_reg;
        break;
                                            /* # args passed as argument */
        case f_execute:
        case f_exec:
        case f_fprintf:
        case f_printf:
            args = va_arg(marker, unsigned);
        break;

        default:
        /*
            default is entered in the switch to prevent a long compiler 
            warning

            default: functions having one arg returning an int

            case f_ascii_int:
            case f_putenv:
            case f_arg_head:
            case f_arg_tail:
            case f_cmd_head:
            case f_cmd_tail:
            case f_echo:
            case f_exists:
            case f_sizeoflist:
        */
    break;
    }
    if (args)
        gencode (e, op_asp, args);          /* add stack pointer */
    set_type(e, type);                      /* type of resulting expression */
}