Update the changelog
[opencv] / apps / cvenv / EiC / callback.c
1 /* this code is for the automatic genteration
2    of call back parameters
3    */
4 #include <stdlib.h>
5 #include <varargs.h>
6
7 #include "MachSet.h"
8 #include "global.h"
9 #include "func.h"
10 #include "xalloc.h"
11 #include "typesets.h"
12 #include "error.h"
13 #include "symbol.h"
14 #include "preproc.h"
15 #include "eic.h"
16 #include "emitter.h"
17
18 #define getop(x,C)    (C->inst[C->nextinst - 5 - 2 * x].opcode)
19
20 void Auto_EiC_CallBack(code_t *callback, va_list ap)
21 {
22     val_t v;
23    int i,N = callback->inst[callback->nextinst-3].val.ival;
24
25    for(i=0;i<N;i++) {
26        switch(getop(i,callback)) {
27            case pushdouble:
28                setArg(i,callback, double, va_arg(ap,double));
29                break;
30            case pushint:
31            case pushuint:
32                setArg(i,callback, int, va_arg(ap,int));
33                break;
34            case pushlong:
35            case pushulong:
36                setArg(i,callback, long, va_arg(ap,long));
37                break;
38            case pushptr:
39                v.p.ep = v.p.sp = v.p.p = va_arg(ap,void *);
40                setArg(i,callback, val_t , v);
41                break;
42        }
43    }
44
45 #if 0
46        EiC_listcode(callback);
47 #endif
48 }
49
50
51
52 #if 1 
53
54 int EiC_genCallBackCode(token_t * e1)
55 {
56     void EiC_listcode(code_t *);
57     int EiC_IsFunc(int t);
58     func_t *f;
59     int i, lineno = CurrentLineNo();
60
61     type_expr * Type;
62
63     if(EiC_gettype(e1->Type) == t_pointer) 
64         Type = nextType(e1->Type);
65     else
66         Type = e1->Type;
67         
68     f = (func_t *) EiC_getInf(Type);
69
70     if (f && getFNp(f) && !getFcallBack(f)) {
71         token_t e2;
72         EiC_inittoken(&e2);
73
74         if(EiC_gettype(Type) == t_builtin)
75             e2.Val.vfunc = e1->Sym->val.vfunc;
76         else    
77             e2.Val.p.p = e1->Sym;
78         
79         EiC_generate(&e2.Code,pushptr,&e2.Val,0);
80
81         setCodeLineNo(&e2.Code,e2.Code.nextinst-1,lineno);
82
83         e2.Val.ival = 1;
84         EiC_generate(&e2.Code,bump,&e2.Val,0);
85         setCodeLineNo(&e2.Code,e2.Code.nextinst-1,lineno);
86
87
88         /* watch for the void argument */
89         if(EiC_gettype(getFPty(f,0)) != t_void) {
90
91             e2.Val.ival = getFNp(f);
92             EiC_generate(&e2.Code,checkar,&e2.Val,1);
93             setCodeLineNo(&e2.Code,e2.Code.nextinst-1,lineno);
94     
95             for (i = 0; i < getFNp(f); i++) {
96                 e2.Pflag = 0;
97                 e2.Type = getFPty(f,i);
98
99                 if(EiC_gettype(e2.Type) == t_var) 
100                     EiC_error("\n Sorry, you can't pass a variadic function through EiC's callBack interface");
101
102                 setConst(e2.Type);
103                 EiC_output(&e2);
104                 EiC_generate(&e2.Code, stoval, &e2.Val, 0);
105                 setCodeLineNo(&e2.Code,e2.Code.nextinst-1,lineno);
106                 unsetConst(e2.Type);
107             }
108         } else 
109             e2.Val.ival = 0;
110         EiC_generate(&e2.Code, pushint, &e2.Val, 0);
111         setCodeLineNo(&e2.Code,e2.Code.nextinst-1,lineno);
112
113
114         if(EiC_gettype(Type) == t_builtin) 
115             EiC_generate(&e2.Code,call,&e2.Val,0);
116         else
117             EiC_generate(&e2.Code,eiccall,&e2.Val,0);
118
119         setCodeLineNo(&e2.Code,e2.Code.nextinst-1,0);
120
121         e2.Val.p.p = NULL;
122         EiC_generate(&e2.Code,halt,&e2.Val,0);
123         setCodeLineNo(&e2.Code,e2.Code.nextinst-1,0);
124
125         if(!EiC_ParseError) {
126             code_t *code = xcalloc(1,sizeof(*code));
127             *code = e2.Code;
128             code->Filename=e1->Sym->fname;
129             code->prev=NULL;
130             if(EiC_gettype(Type) == t_builtin)
131                 code->parent = e1->Sym->val.vfunc;
132             else
133                 code->parent=e1->Sym;
134             setFcallBack(f,code);
135
136         }
137
138         e2.Type = NULL;
139         EiC_freetoken(&e2);
140     }
141
142     return 1;
143 }
144 #endif