unoidl2

Unnamed repository; edit this file to name it for gitweb.
git clone https://logand.com/git/unoidl2.git/
Log | Files | Refs

commit eac08ff414d53e4d57739661f1ba9f94fc2e4f22
parent a8e1db1155c461ec7ff09fa36796b340974c4a88
Author: Tomas Hlavaty <tom@logand.com>
Date:   Sun, 18 Mar 2012 17:09:13 +0100

s/run1/build2 with configurable subst2 for different backends

Diffstat:
Munoidl2.c | 64++++++++++++++++++++++++++++++++--------------------------------
Munoidl2.h | 5++++-
Munoidl2ast.c | 3++-
Munoidl2java.c | 12++++++++++++
4 files changed, 50 insertions(+), 34 deletions(-)

diff --git a/unoidl2.c b/unoidl2.c @@ -292,49 +292,43 @@ static Any intern2abs(Any x) { static Any get2(Any x) {return cddr(car(x));} static Any set2(Any x, Any v) {return con(cdr(car(x)), v);} -static Any module2; -static void run1_module(Any x) { - Any p = module2; - module2 = intern2rel(sym1(cadr(x)), p); - Any v = get2(module2); - if(NIL == v) - set2(module2, car(x)); - mapc(run1, cddr(x)); - module2 = p; -} +static Any module2; +Any subst2_x; -static Any subst2(Any x) { - Any y; - if(consp(x)) { - switch(kind(car(x))) { +Any subst2_rel_abs(Any v) { + Any w; + if(consp(v)) { + switch(kind(car(v))) { case RELATIVE: //(relative XInterface) - y = cdr(x); - set(y, intern2rel(sym1(car(y)), module2)); + w = cdr(v); + set(w, intern2rel(sym1(car(w)), module2)); break; case ABSOLUTE: //(absolute com sun star uno XInterface) - y = cdr(x); - set(y, intern2abs(y)); - con(y, NIL); + w = cdr(v); + set(w, intern2abs(w)); + con(w, NIL); break; default: - mapc(subst2, x); + mapc(subst2_rel_abs, v); } } - return x; + return v; } -static void run1_leave(Any x) { - Any s = intern2rel(sym1(cadr(x)), module2); - if(NIL != get2(s)) - printf("@@@ run1_leave error: duplicate "); - set(cdr(x), s); - set2(s, subst2(x)); -} +Any (*build2_fn)(Any x) = id; -Any run1(Any x) { +Any build2(Any x) { + Any p, s; switch(kind(car(x))) { - case MODULE: run1_module(x); break; + case MODULE: + p = module2; + module2 = intern2rel(sym1(cadr(x)), p); + Any v = get2(module2); + if(NIL == v) set2(module2, car(x)); + mapc(build2, cddr(x)); + module2 = p; + break; case DEFINTERFACE: case EXCEPTION: case ENUM: @@ -343,10 +337,16 @@ Any run1(Any x) { case CONSTANTS: case SINGLETON: case TYPEDEF: - case DEFTEMPLATE: run1_leave(x); break; + case DEFTEMPLATE: + s = intern2rel(sym1(cadr(x)), module2); + if(NIL != get2(s)) printf("@@@ build2 error: duplicate "); + set(cdr(x), s); + subst2_x = s; + set2(s, build2_fn(x)); + break; case INTERFACE: break; // TODO eg XMultiComponentFactory? default: - printf("@@@ run1 error: "); + printf("@@@ build2 error: "); print(x); printf("\n"); } diff --git a/unoidl2.h b/unoidl2.h @@ -65,7 +65,10 @@ Any mapc(Fn1 fn, Any x); Any find(Any elt, Any lst, Fn2 cmp, Fn1 key); Any reverse(Any x, Any a); Any id(Any x); -Any run1(Any x); +extern Any subst2_x; +Any subst2_rel_abs(Any v); +extern Any (*build2_fn)(Any v); +Any build2(Any x); extern void (*walk2_fn)(Any x, Any c, Any k, Any p, Any v); Any walk2(Any x); void init(); diff --git a/unoidl2ast.c b/unoidl2ast.c @@ -34,7 +34,8 @@ int main() { init(); yyparse(); //mapc(pr1, ast); - mapc(run1, ast); + build2_fn = subst2_rel_abs; + mapc(build2, ast); walk2_fn = cell2ast; walk2(root2); return 0; diff --git a/unoidl2java.c b/unoidl2java.c @@ -830,6 +830,16 @@ static void pp(Any x) { printf("NIL"); } +static Any subst2java(Any v) { + v = subst2_rel_abs(v); + switch(kind(car(v))) { + case ENUM: enums = cons(subst2_x, enums); + case STRUCT: structs = cons(subst2_x, structs); + case TYPEDEF: typedefs = cons(subst2_x, typedefs); + } + return v; +} + int main() { init(); yyparse(); @@ -847,5 +857,7 @@ int main() { pp_list(ast, NULL); //print(typedefs); //print(enums); + build2_fn = subst2java; + mapc(build2, ast); return 0; }