diff --git a/declaration.c b/declaration.c
new file mode 100644
index 0000000..942bed7
--- /dev/null
+++ b/declaration.c
@@ -0,0 +1,4781 @@
+/*  $VER: vbcc (declaration.c) $Revision: 1.90 $    */
+
+#include <string.h>
+#include <stdio.h>
+
+#include "vbcc_cpp.h"
+#include "vbc.h"
+
+static char FILE_[]=__FILE__;
+
+#define PLAIN_STORAGE_CLASS 7
+#define PARAMETER 8
+#define OLDSTYLE 16
+
+void dynamic_init(Var *v,type *t,const_list *cl,zmax of,int noconst);
+int test_assignment(type *,np);
+int return_sc,return_reg,has_return,return_inline;
+char *return_vattr;
+static int did_return_label;
+#ifdef HAVE_TARGET_ATTRIBUTES
+unsigned long return_tattr;
+#endif
+zumax return_mask;
+zmax init_dyn_sz,init_const_sz;
+int init_dyn_cnt,init_const_cnt;
+
+void init_sl(struct_list *sl);
+
+#ifdef HAVE_ECPP
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+
+extern np gen_libcall(char *,np,type *,np,type *);
+extern int float_used;
+extern void optimize(long,Var *);
+
+extern type uct;
+
+void needs(char *s)
+{
+  Var *v;
+  if(!(v=find_ext_var(s))||!strcmp(v->identifier,s)){
+    Var *needs=add_var(s,clone_typ(&uct),EXTERN,0);
+    needs->flags|=(USEDASSOURCE|REFERENCED|NEEDS);
+  }		
+}
+
+static void clear_main_ret(void)
+{
+  if(c99&&!strcmp(cur_func,"main")&&return_typ&&ISSCALAR(return_typ->flags)){
+    /* in c99, main returns 0 if it falls from back */
+    IC *new=new_IC();
+    new->code=SETRETURN;
+    new->q1.val.vmax=l2zm(0L);
+    eval_const(&new->q1.val,MAXINT);
+    insert_const(&new->q1.val,return_typ->flags&NU);
+    new->q1.flags=KONST;
+    new->typf=return_typ->flags;
+    new->q2.val.vmax=szof(return_typ);
+    new->q2.flags=new->z.flags=0;
+    new->z.reg=freturn(return_typ);
+    add_IC(new);
+  }
+}
+
+static char *get_string(void)
+/* Liest Stringkonstante und liefert Wert als String (malloced) */
+{
+  np tree;int l;char *p;
+  const_list *cl;
+  killsp();
+  if(ctok->type!=T_STRING) {error(74);return 0;}
+  tree=string_expression();
+  if(!tree||tree->flags!=STRING){
+    error(229);
+    return 0;
+  }
+  cl=tree->cl;l=0;
+  while(cl){
+    l++;
+    cl=cl->next;
+  }
+  p=mymalloc(l);
+  cl=tree->cl;l=0;
+  while(cl){
+    p[l]=CHARBACK(zm2l(zc2zm(cl->other->val.vchar)));
+    l++;
+    cl=cl->next;
+  }
+  if(tree) free_expression(tree);
+  killsp();
+  return p;
+}
+
+/* checks whether string is a valid vector type */
+/* returns the dimension */
+static int check_vect(char *s,char *base)
+{
+  int i=strlen(base),dim;
+  if(strncmp(s,base,i)) return 0;
+  dim=s[i];
+  if(dim=='2'||dim=='3'||dim=='4'||dim=='8'){
+    if(s[i+1]==0)
+      return dim-'0';
+    else
+      return 0;
+  }
+  if(s[i]=='1'&&s[i+1]=='6'&&s[i+2]==0)
+    return 16;
+  return 0;
+}
+
+int settyp(int typnew, int typold)
+/* Unterroutine fuer declaration_specifiers().              */
+{
+  if(DEBUG&2) printf("settyp: new=%d old=%d\n",typnew,typold);
+  if(typold==LONG&&typnew==FLOAT){ error(203); return DOUBLE;}
+  if(typold==LONG&&typnew==DOUBLE) return LDOUBLE;
+  if(c99&&typold==LONG&&typnew==LONG) return LLONG;
+  if(typold==INT&&(typnew==SHORT||typnew==LONG)) return typnew;
+  if(typold!=0&&typnew!=INT){error(47);return(typnew);}
+  if(typold==0&&typnew==INT) return(INT);
+  if(typold==0) return(typnew);
+  if(typold==SHORT||typold==LONG||typold==LLONG) return(typold);
+  error(48);
+  return(typnew);
+}
+
+#define dsc if(storage_class) error(49); if(typ||type_qualifiers) error(50)
+#define XSIGNED 16384
+
+#ifdef HAVE_MISRA
+/* removed */
+#endif
+
+type *declaration_specifiers(void)
+/* Erzeugt neuen Typ und gibt Zeiger darauf zurueck,      */
+/* parst z.B. unsigned int, bla etc.               */
+{
+  int typ=0,type_qualifiers=0,notdone,storage_class,hard_reg,have_inline;
+#ifdef HAVE_ECPP
+/* removed */
+/* removed */
+/* removed */
+#endif
+  char *imerk,sident[MAXI],sbuff[MAXI],*attr=0,*vattr=0;
+  zumax mask=ul2zum(0UL);
+  type *new=new_typ(),*t,*ts;
+  struct_declaration *ssd;
+  struct_list (*sl)[];
+  size_t slsz;
+  Var *v;
+  int dim;
+#ifdef HAVE_TARGET_ATTRIBUTES
+  unsigned long tattr=0;
+#endif
+  storage_class=hard_reg=have_inline=0;
+  do{
+    killsp();notdone=0;
+    if(ctok->type==NAME){
+      if(!strcmp("struct",ctok->name)||!strcmp("union",ctok->name)||(ecpp&&!strcmp("class",ctok->name))){
+        if(!strcmp("struct",ctok->name)) notdone=STRUCT;
+        if(!strcmp("union",ctok->name)) {
+          notdone=UNION;
+#ifdef HAVE_MISRA
+/* removed */
+#endif
+        }
+#ifdef HAVE_ECPP
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+        next_token();
+        killsp();
+        if(ctok->type!=LBRA){
+          cpbez(sident,1);
+          next_token();
+          killsp();
+          ssd=find_struct(sident,0);
+#ifdef HAVE_MISRA
+/* removed */
+#endif
+          if(ssd&&ctok->type==LBRA&&find_struct(sident,nesting)&&ssd->count>0) error(13,sident);
+          if(!ssd||((ctok->type==LBRA||ctok->type==SEMIC)&&!find_struct(sident,nesting))){
+            typ=settyp(notdone,typ);
+            ssd=mymalloc(sizeof(*ssd));
+            ssd->count=0;
+            new->exact=ssd=add_sd(ssd,notdone);
+            if(!ecpp)add_struct_identifier(sident,ssd);
+#ifdef HAVE_ECPP
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+          }else{
+            new->exact=ssd;
+            typ=settyp(new->flags=notdone,typ);
+          }
+        }else{
+          *sident=0;
+          typ=settyp(notdone,typ);
+          ssd=mymalloc(sizeof(*ssd));
+          ssd->count=0;
+          new->exact=ssd=add_sd(ssd,notdone);
+        }
+        if(ssd->typ!=notdone) error(230,sident);
+#ifdef HAVE_ECPP
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif        
+        if(ctok->type==LBRA){
+          int bfoffset,bfsize,flex_array=0,cbfo=0;
+	  int scount;
+          zmax off=l2zm(0L);
+          next_token();
+          killsp();
+          slsz=SLSIZE;
+          imerk=ident;
+            sl=mymalloc(slsz*sizeof(struct_list));
+            ssd->count=0;
+#ifdef HAVE_ECPP
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+	  scount=ssd->count;
+          ts=declaration_specifiers();
+          while(ctok->type!=RBRA&&ts){
+            if(flex_array) error(231);
+            ident=sbuff;
+            t=declarator(clone_typ(ts));
+            killsp();
+            bfsize=bfoffset=-1;
+            if(ctok->type==T_COLON){
+              np tree;
+              if((ts->flags&NQ)!=INT) {
+                error(51);
+#ifdef HAVE_MISRA
+/* removed */
+#endif
+              }
+              next_token();killsp();tree=assignment_expression();
+
+              if(type_expression(tree,0)){
+                int tsize;
+                if(tree->flags!=CEXPR) error(52);
+                if(!ISINT(tree->ntyp->flags)) error(52);
+                eval_const(&tree->val,tree->ntyp->flags);
+                bfsize=(int)zm2l(vmax);
+                tsize=(int)zm2l(zmmult(sizetab[t->flags&NQ],char_bit));
+                if(bfsize<0||bfsize>tsize||(bfsize==0&&*ident)){
+                  error(332);bfsize=1;
+                }
+                if(bfsize+cbfo>tsize){
+                  bfoffset=cbfo=0;
+                }else{
+                  bfoffset=cbfo;
+                }
+                if(bfsize!=0)
+                  cbfo+=bfsize;
+                else
+                  cbfo=0;
+              }
+#ifdef HAVE_MISRA
+/* removed */
+/* removed */
+/* removed */
+#endif
+              if(tree) free_expression(tree);
+            }else{
+              if(!ecpp&&*ident==0) error(53);
+              cbfo=0;
+            }
+#ifdef HAVE_ECPP
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+            if(type_uncomplete(t)){
+              if(!c99||notdone!=STRUCT||flex_array||(t->flags&NQ)!=ARRAY||type_uncomplete(t->next)){
+                error(14,sbuff);
+                freetyp(t);
+                break;
+              }else{
+                flex_array=1;
+              }
+            }
+	    if(ISARRAY(t->flags)&&t->dsize){
+	      error(352,sbuff);
+	    }
+            if(ISFUNC(t->flags)){
+              if(!ecpp){
+                error(15,sbuff);
+              }
+            }
+            if(*ident!=0){
+              int i=scount;
+              while(--i>=0)
+                if(!strcmp((*sl)[i].identifier,ident))
+                  error(16,ident);
+            }
+#ifdef HAVE_MISRA
+/* removed */
+#endif
+#ifdef HAVE_ECPP
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+	    (*sl)[scount].bfoffset=bfoffset;
+            (*sl)[scount].bfsize=bfsize;
+            (*sl)[scount].styp=t;
+            if(!ecpp) (*sl)[scount].identifier=add_identifier(ident,strlen(ident));
+#ifdef HAVE_ECPP
+/* removed */
+/* removed */
+/* removed */
+#endif
+            if(pack_align>0&&pack_align<falign(t))
+              (*sl)[scount].align=pack_align;
+            else
+              (*sl)[scount].align=falign(t);
+            {
+              zmax m,al=(*sl)[scount].align;
+              zmax sz=szof(t);
+              m=off;
+              if((zmeqto(al,l2zm(0L))||zmeqto(sz,l2zm(0L)))&&!flex_array){
+                if (!ecpp){
+                  error(316,ident);
+                }
+              }else{
+                off=zmmult(zmdiv(zmadd(off,zmsub(al,l2zm(1L))),al),al);
+                if(!zmeqto(m,off)) error(306,ident);
+                if(!flex_array){
+                  m=zmmult(zmdiv(zmadd(off,zmsub(sz,l2zm(1L))),sz),sz);
+                  if(!zmeqto(m,off)) error(307,ident);
+                  off=zmadd(off,sz);
+                }
+              }
+            }
+            scount++;
+            if(scount>=slsz-1){
+              slsz+=SLSIZE;
+              sl=myrealloc(sl,slsz*sizeof(struct_list));
+            }
+            killsp();
+            if(ctok->type==COMMA) {next_token();killsp();continue;}
+            if(ctok->type!=SEMIC) error(54); else next_token();
+            killsp();
+#ifdef HAVE_ECPP
+/* removed */
+#endif
+            if(ctok->type!=RBRA){
+              if(ts) freetyp(ts);
+              ts=declaration_specifiers();killsp();
+            }
+          }
+          if(ts) freetyp(ts);
+	  ssd->count=scount;
+          if(ssd->count==0) error(55);
+#ifdef HAVE_ECPP
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+          ident=imerk;
+					add_sl(ssd,sl);
+					free(sl);
+          if(ctok->type!=RBRA) error(56); else next_token();
+          new->flags=notdone|type_qualifiers;
+        }
+#ifdef HAVE_ECPP
+/* removed */
+#endif
+        notdone=1;
+      }else if(!strcmp("enum",ctok->name)){
+        /*  enumerations; die Namen werden leider noch ignoriert    */
+        next_token();killsp();notdone=1;
+        if(ctok->type!=LBRA){cpbez(buff,1);next_token();killsp();}
+        if(ctok->type==LBRA){
+          /* mode: 0=start 1=first was not init 2=first was init 3=more init */
+          zmax val; Var *v; type *t;int mode=0;
+          val=l2zm(0L);
+          next_token();killsp();
+          while(ctok->type!=RBRA){
+            cpbez(sident,1);next_token();killsp();
+            if(*sident==0) {error(56);break;}
+            t=new_typ();
+            t->flags=CONST|INT;
+            if(find_var(sident,nesting)) error(17,sident);
+            v=add_var(sident,t,AUTO,0); /*  AUTO hier klug? */
+            if(ctok->type==ASGN){
+              if(mode==2) mode=3;
+              if(mode==0) mode=2;
+#ifdef HAVE_MISRA                                /* MISRA Rule 9.3 checking */
+/* removed */
+#endif
+              next_token();killsp();
+              v->clist=initialization(v->vtyp,0,0,0,0,0);
+              val=zi2zm(v->clist->val.vint);killsp();
+            }else{
+              if(mode==0) mode=1;
+#ifdef HAVE_MISRA                                /* MISRA Rule 9.3 checking */
+/* removed */
+#endif
+              v->clist=mymalloc(CLS);
+              v->clist->val.vint=zm2zi(val);
+              v->clist->next=v->clist->other=0;
+              v->clist->tree=0;
+	      v->clist->idx=l2zm(0L);
+            }
+            vmax=l2zm(1L);val=zmadd(val,vmax);
+            v->vtyp->flags=CONST|ENUM;
+            if(ctok->type!=RBRA&&ctok->type!=COMMA) {error(56);break;}
+            if(ctok->type==COMMA) next_token();
+            killsp();
+            if(ctok->type==RBRA) {next_token(); break;}
+          }
+        }
+        killsp();
+        typ=settyp(INT,typ);
+      }else if(!strcmp("__readsmem",ctok->name)||!strcmp("__writesmem",ctok->name)){
+        enum {READS,WRITES} op;
+        char *imerk,tbuf[MAXI];
+        type *tmp;
+        if(!strcmp("__readsmem",ctok->name))
+          op=READS;
+        else
+          op=WRITES;
+        next_token();killsp();
+        if(ctok->type==LPAR) next_token(); else error(151);
+        imerk=ident;ident=tbuf;
+        tmp=declarator(declaration_specifiers());
+        ident=imerk;
+        if(tmp){
+          if(vattr)
+            vattr=myrealloc(vattr,strlen(vattr)+25);
+          else{
+            vattr=mymalloc(25);
+            vattr[0]=0;
+          }
+          sprintf(vattr+strlen(vattr),";%s(%d)",op==READS?"readmem":"writemem",tmp->flags);
+        }
+        killsp();
+        if(ctok->type==RPAR) next_token(); else error(59);
+        killsp();
+        notdone=1;
+      }else if(!strcmp("void",ctok->name)){
+        next_token();
+        typ=settyp(VOID,typ);notdone=1;
+      }else if(!strcmp("char",ctok->name)){
+#ifdef HAVE_MISRA
+/* removed */
+/* removed */
+#endif
+        next_token();
+        typ=settyp(CHAR,typ);
+	notdone=1;
+	if(default_unsigned&&!(type_qualifiers&XSIGNED))
+	  type_qualifiers|=UNSIGNED;
+      }else if(!strcmp("short",ctok->name)){
+#ifdef HAVE_MISRA
+/* removed */
+#endif
+        next_token();
+        typ=settyp(SHORT,typ);notdone=1;
+      }else if(!strcmp("int",ctok->name)){
+#ifdef HAVE_MISRA
+/* removed */
+#endif
+        next_token();
+        typ=settyp(INT,typ);notdone=1;
+      }else if(!strcmp("long",ctok->name)){
+#ifdef HAVE_MISRA
+/* removed */
+#endif
+        next_token();
+        typ=settyp(LONG,typ);notdone=1;
+      }else if(!strcmp("float",ctok->name)){
+#ifdef HAVE_MISRA
+/* removed */
+#endif
+        next_token();
+        typ=settyp(FLOAT,typ);notdone=1;
+      }else if(!strcmp("double",ctok->name)){
+#ifdef HAVE_MISRA
+/* removed */
+#endif
+        next_token();
+        typ=settyp(DOUBLE,typ);notdone=1;
+      }else if(!strcmp("const",ctok->name)){
+        next_token();
+        if(type_qualifiers&CONST) error(58);
+        type_qualifiers|=CONST;notdone=1;
+      }else if(!strcmp("volatile",ctok->name)){
+        next_token();
+        if(type_qualifiers&VOLATILE) error(58);
+        type_qualifiers|=VOLATILE;notdone=1;
+      }else if(opencl&&(dim=check_vect(ctok->name,"bool"))){
+	next_token();
+	typ=settyp(VECBOOL+dim-1,typ);
+	notdone=1;
+      }else if(opencl&&(dim=check_vect(ctok->name,"char"))){
+	next_token();
+	typ=settyp(VECCHAR+dim-1,typ);
+	notdone=1;
+      }else if(opencl&&(dim=check_vect(ctok->name,"uchar"))){
+	next_token();
+	typ=settyp((VECCHAR+dim-1)|UNSIGNED,typ);
+	notdone=1;
+      }else if(opencl&&(dim=check_vect(ctok->name,"short"))){
+	next_token();
+	typ=settyp(VECSHORT+dim-1,typ);
+	notdone=1;
+      }else if(opencl&&(dim=check_vect(ctok->name,"ushort"))){
+	next_token();
+	typ=settyp((VECSHORT+dim-1)|UNSIGNED,typ);
+	notdone=1;
+      }else if(opencl&&(dim=check_vect(ctok->name,"int"))){
+	next_token();
+	typ=settyp(VECINT+dim-1,typ);
+	notdone=1;
+      }else if(opencl&&(dim=check_vect(ctok->name,"uint"))){
+	next_token();
+	typ=settyp((VECINT+dim-1)|UNSIGNED,typ);
+	notdone=1;
+      }else if(opencl&&(dim=check_vect(ctok->name,"long"))){
+	next_token();
+	typ=settyp(VECLONG+dim-1,typ);
+	notdone=1;
+      }else if(opencl&&(dim=check_vect(ctok->name,"ulong"))){
+	next_token();
+	typ=settyp((VECLONG+dim-1)|UNSIGNED,typ);
+	notdone=1;
+      }else if(opencl&&(dim=check_vect(ctok->name,"float"))){
+	next_token();
+	typ=settyp(VECFLOAT+dim-1,typ);
+	notdone=1;
+#if 0
+      }else if(c99&&!strcmp("restrict",ctok->name)){
+        next_token();
+        if(type_qualifiers&RESTRICT) error(58);
+        type_qualifiers|=RESTRICT;notdone=1;
+#endif
+      }else if(!strcmp("unsigned",ctok->name)){
+        next_token();
+        if(type_qualifiers&(XSIGNED|UNSIGNED)) error(58);
+        notdone=1;type_qualifiers|=UNSIGNED;
+      }else if(!strcmp("signed",ctok->name)){
+        next_token();
+        if(type_qualifiers&(XSIGNED|UNSIGNED)) error(58);
+        notdone=1;type_qualifiers|=XSIGNED;
+      }else if(!strcmp("auto",ctok->name)){
+        next_token();
+        dsc;storage_class=AUTO;notdone=1;
+      }else if(!strcmp("register",ctok->name)){
+#ifdef HAVE_MISRA
+/* removed */
+#endif
+        next_token();
+        dsc;storage_class=REGISTER;notdone=1;
+      }else if(!strcmp("static",ctok->name)){
+        next_token();
+        dsc;storage_class=STATIC;notdone=1;
+#ifdef HAVE_ECPP
+/* removed */
+#endif
+      }else if(!strcmp("extern",ctok->name)){
+        next_token();
+        dsc;storage_class=EXTERN;notdone=1;
+      }else if(!strcmp("typedef",ctok->name)){
+        next_token();
+        dsc;storage_class=TYPEDEF;notdone=1;
+      }else if(c99&&!strcmp("inline",ctok->name)){
+        next_token();
+        have_inline=1;notdone=1;
+#ifdef HAVE_ECPP
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+			}else if(/*!(c_flags[7]&USEDFLAG)&&*/!strcmp("__reg",ctok->name)){
+        char *d;
+        next_token();killsp(); 
+        if(ctok->type==LPAR) next_token(); else error(151);
+        killsp();
+        if(d=get_string()){
+          for(hard_reg=1;hard_reg<=MAXR;hard_reg++){
+            if(!strcmp(d,regnames[hard_reg])) break;
+          }
+          if(hard_reg>MAXR){ hard_reg=0;error(220,d);}
+          notdone=1;
+          free(d);
+        }
+        killsp();
+        if(ctok->type==RPAR) next_token(); else error(59);
+        killsp();
+      }else if(!strcmp("__mask",ctok->name)){
+	np tree;
+	next_token();killsp();
+        if(ctok->type==LPAR) next_token(); else error(151);
+	tree=expression();
+	if(tree&&type_expression(tree,0)){
+	  if(tree->flags==CEXPR&&ISINT(tree->ntyp->flags)){
+	    eval_const(&tree->val,tree->ntyp->flags);
+	    mask=vumax;
+	  }else
+	    error(18);
+	  free_expression(tree);
+	}else
+	  error(18);
+        killsp();
+        if(ctok->type==RPAR) next_token(); else error(59);
+        killsp();
+	notdone=1;
+      }else if(/*!(c_flags[7]&USEDFLAG)&&*/!strcmp("__attr",ctok->name)){
+        char *d;
+        next_token();killsp(); 
+        if(ctok->type==LPAR) next_token(); else error(151);
+        killsp();
+        if(d=get_string()){
+          if(!attr){
+            attr=d;
+          }else{
+            attr=myrealloc(attr,strlen(attr)+strlen(d)+2);
+            strcat(attr,";");
+            strcat(attr,d);
+            free(d);
+          }
+          notdone=1;
+        }
+        killsp();
+        if(ctok->type==RPAR) next_token(); else error(59);
+        killsp();
+      }else if(/*!(c_flags[7]&USEDFLAG)&&*/!strcmp("__vattr",ctok->name)){
+        char *d;
+        next_token();killsp();
+        if(ctok->type==LPAR) next_token(); else error(151);
+        killsp();
+        if(d=get_string()){
+          if(!vattr){
+            vattr=d;
+          }else{
+            vattr=myrealloc(vattr,strlen(vattr)+strlen(d)+2);
+            strcat(vattr,";");
+            strcat(vattr,d);
+            free(d);
+          }
+          notdone=1;
+        }
+        killsp();
+        if(ctok->type==RPAR) next_token(); else error(59);
+        killsp();
+      }else{
+#ifdef HAVE_TARGET_ATTRIBUTES
+        int i;
+        for(i=0;g_attr_name[i];i++){
+          if(!strcmp(g_attr_name[i],ctok->name)){
+            if(tattr&(1L<<i)) error(227,ctok->name);
+            tattr|=(1L<<i);
+            next_token();
+            notdone=1;break;
+          }
+        }
+#endif
+        if(!notdone&&typ==0&&!(type_qualifiers&(XSIGNED|UNSIGNED))){
+          v=find_var(ctok->name,0);
+          if(v&&v->storage_class==TYPEDEF){
+            free(new);
+            new=clone_typ(v->vtyp);
+            typ=settyp(new->flags,typ);
+            notdone=1;
+            next_token();
+          }
+#ifdef HAVE_ECPP
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+        }
+      }
+    }
+#ifdef HAVE_ECPP
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+    if(DEBUG&2) printf("typ:%d\n",typ);
+  }while(notdone);
+  killsp();
+  return_sc=storage_class;
+  return_reg=hard_reg;
+  return_vattr=vattr;
+  return_mask=mask;
+  return_inline=have_inline;
+#ifdef HAVE_ECPP
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+#ifdef HAVE_TARGET_ATTRIBUTES
+  return_tattr=tattr;
+#endif
+  if(typ==0){
+    if(storage_class==0&&type_qualifiers==0&&!hard_reg){
+      free(new);
+      return 0;
+    }
+#ifdef HAVE_MISRA
+/* removed */
+#endif
+    typ=INT;
+  }
+  if(type_qualifiers&(XSIGNED|UNSIGNED))
+    if(!ISINT(typ))
+      error(58);
+  new->flags=typ|type_qualifiers;
+  new->attr=attr;
+  return new;
+}
+
+type *declarator(type *a)
+/* Erzeugt einen neuen Typ, auf Basis des Typs a.           */
+/* a wird hiermit verkettet.                                */
+{
+  type *t;
+  killsp();*ident=0;
+  t=direct_declarator(pointer(a));
+  if(!a)
+    {if(t) freetyp(t);return 0;}
+#ifdef HAVE_ECPP
+/* removed */
+#endif
+#ifdef HAVE_EXT_TYPES
+  conv_typ(t);
+#endif  
+  return t;
+}
+type *pointer(type *a)
+/* Unterroutine fuer declarator(), behandelt Zeiger auf Typ.   */
+{
+  type *t;char *attr;int notdone;
+  if(!a) return(0);
+  killsp();
+  while(ctok->type==STAR){
+    next_token();
+    t=new_typ();
+    t->flags=POINTER_TYPE(a);
+    t->next=a;
+    attr=0;
+    a=t;
+    do{
+      killsp();
+      notdone=0;
+      if(ctok->type==NAME&&!strcmp("const",ctok->name)){
+	a->flags|=CONST;
+	notdone=1;
+	next_token();
+      }else if(ctok->type==NAME&&!strcmp("volatile",ctok->name)){
+	a->flags|=VOLATILE;
+	notdone=1;
+	next_token();
+      }else if(c99&&ctok->type==NAME&&!strcmp("restrict",ctok->name)){
+	a->flags|=RESTRICT;
+	notdone=1;
+	next_token();
+      }else if(ctok->type==NAME&&!strcmp("__attr",ctok->name)){
+	char *d;
+	next_token();
+	killsp();
+	if(ctok->type==LPAR) next_token(); else error(151);
+	killsp();
+	if(d=get_string()){
+	  if(!attr){
+	    attr=d;
+	  }else{
+	    attr=myrealloc(attr,strlen(attr)+strlen(d)+2);
+	    strcat(attr,";");
+	    strcat(attr,d);
+	    free(d);
+	  }
+	  notdone=1;
+	}
+	killsp();
+	if(ctok->type==RPAR) next_token(); else error(59);
+	killsp();
+      }
+    }while(notdone);
+    a->attr=attr;
+  }
+  return a;
+}
+type *direct_declarator(type *a)
+/*  Unterroutine zu declarator()                    */
+/*  behandelt [],(funkt),(dekl).                     */
+{
+  type *rek=0,*merk,*p,*t=0,*first,*last=0;
+  struct_declaration *fsd;
+  struct_list (*sl)[];
+  size_t slsz;char *imerk;
+  char fbuff[MAXI];
+  killsp();
+  if(ctok->type!=NAME&&ctok->type!=LPAR&&ctok->type!=LBRK)
+    return a;
+  if(ctok->type==NAME){
+    cpbez(ident,1);
+    next_token();
+    if(!a) return(0);
+#ifdef HAVE_ECPP
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+  }
+  else if(ctok->type==LPAR&&a){
+    /* Rekursion */
+    token mtok;
+    copy_token(&mtok,ctok);
+    next_token(); killsp();
+    if(ctok->type!=RPAR&&*ident==0&&!declaration(0)){
+      merk=a;
+      rek=declarator(a);
+      if(ctok->type!=RPAR) error(59); else next_token();
+    }else
+
+      push_token(&mtok);
+    free(mtok.name);
+  }
+  if(!a)return(0);
+  killsp();
+  while(ctok->type==LBRK||ctok->type==LPAR){
+    if(ctok->type==LBRK){
+      next_token();
+      killsp();
+      p=new_typ();
+      p->flags=ARRAY;
+      p->next=0;
+      if(ctok->type==RBRK){
+        p->size=l2zm(0L);
+      }else{
+        np tree;
+        tree=expression();
+        if(!type_expression(tree,0)){
+          /*                    error("incorrect constant expression");*/
+        }else{
+          if(tree->sidefx&&!c99) error(60);
+          if(tree->flags!=CEXPR||!ISINT(tree->ntyp->flags)){
+	    if(!c99||!ALLOCVLA_INLINEASM)
+	      error(19);
+	    else{
+	      type *st;IC *new;
+	      st=new_typ();
+	      st->flags=HAVE_INT_SIZET?(UNSIGNED|INT):(UNSIGNED|LONG);
+	      p->dsize=add_tmp_var(st);
+	      gen_IC(tree,0,0);
+	      convert(tree,st->flags);
+	      new=new_IC();
+	      new->code=ASSIGN;
+	      new->typf=st->flags;
+	      new->q1=tree->o;
+	      new->z.flags=VAR;
+	      new->z.v=p->dsize;
+	      new->z.val.vmax=l2zm(0L);
+	      new->q2.val.vmax=szof(st);
+	      add_IC(new);
+	    }
+          }else{
+            eval_constn(tree);
+            p->size=vmax;
+            if(zmleq(p->size,l2zm(0L))) {error(61);p->size=l2zm(1L);}
+          }
+        }
+        free_expression(tree);
+      }
+      if(ctok->type!=RBRK) error(62); else next_token();
+      if(last){
+        last->next=p;
+        last=p;
+      }else{
+        first=last=p;
+      }
+    }
+#ifdef HAVE_ECPP
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+    if(ctok->type==LPAR){
+      int komma,firstparm,oldstyle=0;
+#if 0 /*#ifdef HAVE_REGPARMS*/
+      treg_handle reg_handle=empty_reg_handle;
+      type rpointer={0};
+      if(!ffreturn(a)&&(a->flags&NQ)!=VOID){
+	rpointer.flags=POINTER_TYPE(a);
+        rpointer.next=a;
+        reg_parm(&reg_handle,&rpointer,0,a); /*TODO: a might be incomplete */
+      }
+#endif
+#ifdef HAVE_MISRA
+/* removed */
+/* removed */
+#endif
+      next_token();
+      killsp();
+#ifdef HAVE_MISRA
+/* removed */
+#endif
+      fsd=mymalloc(sizeof(*fsd));
+      slsz=SLSIZE;
+      sl=mymalloc(sizeof(struct_list)*slsz);
+      fsd->count=0;
+      imerk=ident;komma=0;
+      enter_block();
+      firstparm=1;
+      while(ctok->type!=RPAR&&ctok->type!=MDOTS){
+        int hard_reg;
+#ifdef HAVE_ECPP
+/* removed */
+#endif
+	if(!firstparm&&!komma) error(57);
+	komma=firstparm=0;
+        ident=fbuff;*fbuff=0;
+        t=declaration_specifiers();
+        hard_reg=return_reg;
+        t=declarator(t);
+        if(!t){
+          oldstyle=1;
+          if(*ident==0) {error(20);freetyp(t);continue;}
+        }
+        if(fsd->count){
+          if((t&&!(*sl)[fsd->count-1].styp)||
+             (!t&&(*sl)[fsd->count-1].styp))
+            error(63);
+        }
+#ifdef HAVE_ECPP
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+        if(!return_sc) return_sc=AUTO;
+        if(return_sc!=AUTO&&return_sc!=REGISTER)
+          {error(21);return_sc=AUTO;}
+        (*sl)[fsd->count].styp=t;
+        (*sl)[fsd->count].storage_class=return_sc;
+	{
+	  int m=nesting;
+	  nesting=0;
+	  (*sl)[fsd->count].identifier=add_identifier(ident,strlen(ident));
+	  nesting=m;
+	}
+        if(t){
+          if(((*sl)[fsd->count].styp->flags&NQ)==VOID&&fsd->count!=0)
+            error(22);
+          /*  Arrays in Zeiger umwandeln  */
+          if(ISARRAY((*sl)[fsd->count].styp->flags))
+            (*sl)[fsd->count].styp->flags=POINTER_TYPE((*sl)[fsd->count].styp->next);
+	  /*  Funktionen in Zeiger auf Funktionen umwandeln   */
+	  if(ISFUNC((*sl)[fsd->count].styp->flags)){
+	    type *new;
+	    new=new_typ();
+	    new->next=(*sl)[fsd->count].styp;
+	    new->flags=POINTER_TYPE(new->next);
+	    (*sl)[fsd->count].styp=new;
+	  }
+	}
+        if(hard_reg&&regok(hard_reg,t->flags,-1)<=0) error(217,regnames[hard_reg]);
+#if 0 /*#ifdef HAVE_REGPARMS*/
+        if(t) (*sl)[fsd->count].reg=reg_parm(&reg_handle,t,0,a); /*TODO: a might be incomplete */
+        if(hard_reg) (*sl)[fsd->count].reg=hard_reg;
+#else
+        (*sl)[fsd->count].reg=hard_reg;
+#endif
+        fsd->count++;
+        if(fsd->count>=slsz-2){     /*  eins Reserve fuer VOID  */
+          slsz+=SLSIZE;
+          sl=myrealloc(sl,slsz*sizeof(struct_list));
+        }
+        killsp(); /* Hier Syntaxpruefung strenger machen */
+        if(ctok->type==COMMA) {next_token();komma=1; killsp();}
+      }
+      ident=imerk;
+#ifdef HAVE_MISRA
+/* removed */
+#endif
+      if(ctok->type!=MDOTS||!komma){
+        int ecpp_addvoid=0;
+#ifdef HAVE_ECPP
+/* removed */
+#endif
+        if(ecpp_addvoid||(!ecpp&&fsd->count>0&&(!(*sl)[fsd->count-1].styp||((*sl)[fsd->count-1].styp->flags&NQ)!=VOID))){
+          (*sl)[fsd->count].styp=new_typ();
+          (*sl)[fsd->count].styp->flags=VOID;
+          (*sl)[fsd->count].styp->next=0;
+          (*sl)[fsd->count].reg=0;
+          (*sl)[fsd->count].identifier=empty;
+#ifdef HAVE_ECPP
+/* removed */
+#endif
+          fsd->count++;
+        }
+        if(ecpp&&ctok->type==MDOTS){next_token();killsp();}
+      }else if(komma){
+        next_token();komma=0;
+        if(oldstyle) error(221);
+      }
+      p=new_typ();
+      p->flags=FUNKT;
+      {
+        int m=nesting;
+        nesting=0;
+        p->exact=add_sd(fsd,FUNKT);
+        add_sl(fsd,sl);
+        free(sl);
+        nesting=m;
+      }
+#ifdef HAVE_REGPARMS
+      {
+	treg_handle reg_handle=empty_reg_handle;
+	int i,r;
+
+	p->next=a;
+
+	if(!ffreturn(a)&&(a->flags&NQ)!=VOID){
+	  type rpointer={0};
+
+	  rpointer.flags=POINTER_TYPE(a);
+	  rpointer.next=a;
+	  reg_parm(&reg_handle,&rpointer,0,p);
+	}
+
+	for(i=0;i<p->exact->count;i++){
+	  if((*p->exact->sl)[i].styp)
+	    r=reg_parm(&reg_handle,(*p->exact->sl)[i].styp,0,p);
+	  else
+	    r=0;
+	  if((*p->exact->sl)[i].reg==0) (*p->exact->sl)[i].reg=r;
+	}
+      }
+#endif
+      killsp();
+      if(komma) error(59);
+      if(ctok->type!=RPAR) error(59); else next_token();
+      killsp();
+      if(ctok->type==COMMA||ctok->type==SEMIC||ctok->type==RPAR||ctok->type==ASGN)
+	leave_block();
+      if(last){
+        last->next=p;
+        last=p;
+      }else{
+        first=last=p;
+      }
+    }
+    killsp();
+  }
+  if(last){last->next=a;last=a;a=first;}
+  if(rek!=0&&rek!=merk){
+    /* Zweite Liste anhaengen */
+    p=rek;
+    while(p->next!=merk) p=p->next;
+    if(p) p->next=a; else ierror(0);
+    return rek;
+  }
+  return a;
+}
+int declaration(int offset)
+/*  Testet, ob eine Typangabe kommt. Wenn offset!=0 ist,    */
+/*  muss s auf '(' zeigen und es wird getestet, ob nach der */
+/*  Klammer eine Typangabe kommt.                           */
+/*  In jedem Fall zeigt s danach wieder auf dieselbe Stelle */
+/*  im Source.                                              */
+{
+  Var *v;token mtok;
+  int fl=0;
+  if(offset){
+    copy_token(&mtok,ctok);
+    next_token();
+    killsp();
+  }
+  if(ctok->type==NAME){
+    if(!strcmp("auto",ctok->name)) fl=1;
+    else if(!strcmp("char",ctok->name)) fl=1;
+    else if(!strcmp("const",ctok->name)) fl=1;
+    else if(!strcmp("double",ctok->name)) fl=1;
+    else if(!strcmp("enum",ctok->name)) fl=1;
+    else if(!strcmp("extern",ctok->name)) fl=1;
+    else if(!strcmp("float",ctok->name)) fl=1;
+    else if(!strcmp("int",ctok->name)) fl=1;
+    else if(!strcmp("long",ctok->name)) fl=1;
+    else if(!strcmp("register",ctok->name)) fl=1;
+    else if(c99&&!strcmp("restrict",ctok->name)) fl=1;
+    else if(!strcmp("short",ctok->name)) fl=1;
+    else if(!strcmp("signed",ctok->name)) fl=1;
+    else if(!strcmp("static",ctok->name)) fl=1;
+    else if(!strcmp("struct",ctok->name)) fl=1;
+    else if(!strcmp("typedef",ctok->name)) fl=1;
+    else if(!strcmp("union",ctok->name)) fl=1;
+    else if(!strcmp("unsigned",ctok->name)) fl=1;
+    else if(!strcmp("void",ctok->name)) fl=1;
+    else if(!strcmp("volatile",ctok->name)) fl=1;
+    else if(/*!(c_flags[7]&USEDFLAG)&&*/!strcmp("__reg",ctok->name)) fl=1;
+    else if(/*!(c_flags[7]&USEDFLAG)&&*/!strcmp("__attr",ctok->name)) fl=1;
+    else if(/*!(c_flags[7]&USEDFLAG)&&*/!strcmp("__vattr",ctok->name)) fl=1;
+    else if(/*!(c_flags[7]&USEDFLAG)&&*/!strcmp("__mask",ctok->name)) fl=1;
+    else if(/*!(c_flags[7]&USEDFLAG)&&*/!strcmp("__readsmem",ctok->name)) fl=1;
+    else if(/*!(c_flags[7]&USEDFLAG)&&*/!strcmp("__writesmem",ctok->name)) fl=1;
+    else{
+      v=find_var(ctok->name,0);
+      if(v&&v->storage_class==TYPEDEF) fl=1;
+    }
+  }
+#ifdef HAVE_ECPP
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+  if(offset){
+    push_token(&mtok);
+    free(mtok.name);
+  }
+  return fl;
+}
+void init_sl(struct_list *sl){
+  if(!sl){ierror(0);return;}
+  sl->identifier=0;
+  sl->styp=0;
+  sl->align=0;
+  sl->bfoffset=-1;
+  sl->bfsize=-1;
+  sl->reg=0;
+  sl->storage_class=0;
+#ifdef HAVE_ECPP
+/* removed */
+#endif
+}
+void add_sl(struct_declaration *sd,struct_list (*sl)[])
+/*  Fuegt ein struct_list-Array in eine struct_declaration ein.     */
+/*  Das Array muss mind. sd->count Elements haben und wird kopiert. */
+{
+  size_t sz=sizeof(struct_list)*sd->count;
+  sd->sl=mymalloc(sz);
+  memcpy(sd->sl,sl,sz);
+}
+struct_declaration *add_sd(struct_declaration *new,int typ)
+/*  Fuegt eine Declaration in Liste ein.     */
+{
+  new->next=0;
+  new->label=0;
+  new->typ=typ;
+  new->identifier=0;
+  new->tunit=last_tunit;
+#ifdef HAVE_ECPP
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+  if(first_sd[nesting]==0){
+    first_sd[nesting]=last_sd[nesting]=new;
+  }else{
+    last_sd[nesting]->next=new;
+    last_sd[nesting]=new;
+  }
+  return new;
+}
+void free_sd(struct_declaration *p)
+/*  Gibt eine struct_declaration-List inkl. struct_lists und    */
+/*  allen Typen jeder struct_list frei, nicht aber identifier.  */
+{
+  int i;struct_declaration *merk;
+  while(p){
+    merk=p->next;
+    if(p->sl){
+      for(i=0;i<p->count;i++){
+	if((*p->sl)[i].styp) freetyp((*p->sl)[i].styp);
+      }
+      if(p->count>0) free(p->sl);
+    }
+#ifdef HAVE_ECPP
+/* removed */
+/* removed */
+/* removed */
+#endif
+    free(p);
+    p=merk;
+  }
+}
+char *add_identifier(char *identifier,int length)
+/*  Kopiert identifier an sicheren Ort, der spaeter zentral     */
+/*  freigegeben werden kann.                                    */
+/*  Sollte noch einbauen, dass ueberprueft wird, ob schon       */
+/*  vorhanden und dann nicht zweimal speichern.                 */
+{
+  identifier_list *new;
+  if((*identifier==0&&length==0)||identifier==empty) return(empty);
+  new=mymalloc(sizeof(identifier_list));
+  new->identifier=mymalloc(length+1);
+  memcpy(new->identifier,identifier,length+1);
+  new->next=0;new->length=length;
+  if(last_ilist[nesting]){
+    last_ilist[nesting]->next=new;
+    last_ilist[nesting]=new;
+  }else{
+    last_ilist[nesting]=first_ilist[nesting]=new;
+  }
+  return(new->identifier);
+}
+void free_ilist(identifier_list *p)
+/*  Gibt eine verkettete identifier_liste und saemtliche darin  */
+/*  gespeicherten Identifier frei.                              */
+{
+  identifier_list *merk;
+  while(p){
+    merk=p->next;
+    if(p->identifier) free(p->identifier);
+    free(p);
+    p=merk;
+  }
+}
+int type_uncomplete(type *p)
+/*  Testet, ob Typ unvollstaendig ist. Momentan gelten nur      */
+/*  unvollstaendige Strukturen und Arrays von solchen als       */
+/*  unvollstaendig, aber keine Zeiger oder Funktionen darauf.   */
+{
+  struct_declaration *sd;
+  if(!p){ierror(0);return(0);}
+  if(ISSTRUCT(p->flags)||ISUNION(p->flags))
+    if(p->exact->count<=0) return 1;
+  if(ISARRAY(p->flags)){
+    if(!p->dsize&&zmleq(p->size,l2zm(0L))) return 1;
+if(!p->next) ierror(0);
+    if(type_uncomplete(p->next)) return 1;
+  }
+  return 0;
+}
+void add_struct_identifier(char *identifier,struct_declaration *sd)
+/*  Erzeugt neuen struct_identifier, fuegt ihn in Liste an und  */
+/*  vervollstaendigt unvollstaendige Typen dieser Struktur.     */
+{
+  struct_identifier *new;
+/*    type *t;*/
+  if(DEBUG&1) printf("add_si %s (nesting=%d)->%p\n",identifier,nesting,(void *)sd);
+#ifdef HAVE_MISRA
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+  new=mymalloc(sizeof(struct_identifier));
+  new->identifier=add_identifier(identifier,strlen(identifier));
+  new->sd=sd;
+  new->next=0; 
+  if(first_si[nesting]==0){
+    first_si[nesting]=new;last_si[nesting]=new;
+  }else{
+    last_si[nesting]->next=new;last_si[nesting]=new;
+  }
+  sd->identifier=new->identifier;
+}
+void free_si(struct_identifier *p)
+/*  Gibt eine struct_identifier-Liste frei, aber nicht die      */
+/*  identifiers und struct_declarations.                        */
+{
+  struct_identifier *merk;
+  while(p){
+    merk=p->next;
+    p->sd->identifier="<prototype-only>";
+    free(p);
+    p=merk;
+  }
+}
+struct_declaration *find_struct(char *identifier,int endnesting)
+
+/*  Sucht angegebene Strukturdefinition und liefert             */
+/*  entsprechende struct_declaration.                           */
+{
+  struct_identifier *si; int i,l;
+  if(misracheck) l=strlen(identifier);
+  for(i=nesting;i>=endnesting;i--){
+    si=first_si[i];
+    while(si){
+      if(!strcmp(si->identifier,identifier)){
+        if(DEBUG&1) printf("found tag <%s> at nesting %d->%p\n",identifier,i,(void *)si->sd);
+        return(si->sd);
+      }
+#ifdef HAVE_MISRA
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+	si=si->next;
+	}
+  }
+  if(DEBUG&1) printf("didn't find tag <%s>\n",identifier);
+  return(0);
+}
+
+/* generate code to create a variable-lenght-array */
+static void create_allocvl(Var *v)
+{
+  np tree,ds;
+  IC *new;Var *fv;
+
+  /* check if we got a frame-pointer */
+  if(FPVLA_REG&&!regsa[FPVLA_REG]){
+    if(regused[FPVLA_REG])
+      ierror(0);
+    else
+      regsa[FPVLA_REG]=regscratch[FPVLA_REG]=regused[FPVLA_REG]=1;
+  }
+
+  /* if this is the first vla in this block, save old sp */
+  if(!block_vla[nesting]){
+    /* declare function - may be done by the backend, if necessary */
+    if(!(fv=find_ext_var("__oldvlasp"))){
+      type *t;
+      static type voidt={VOID};
+      struct_declaration *sd=mymalloc(sizeof(*sd));
+      t=new_typ();
+      t->flags=FUNKT;
+
+      t->next=new_typ();
+      t->next->flags=POINTER_TYPE(&voidt);
+      t->next->next=clone_typ(&voidt);
+      sd->count=0;
+      t->exact=add_sd(sd,FUNKT);
+      fv=add_var("__oldvlasp",t,EXTERN,0);
+      fv->fi=new_fi();
+      fv->fi->flags|=(ALL_USES|ALL_MODS);
+      fv->fi->inline_asm=mystrdup(OLDSPVLA_INLINEASM);
+    } 
+    block_vla[nesting]=add_tmp_var(clone_typ(fv->vtyp->next));
+    tree=gen_libcall("__oldvlasp",0,0,0,0);
+    new=new_IC();
+    new->code=ASSIGN;
+    new->z.flags=VAR;
+    new->z.v=block_vla[nesting];
+    new->z.val.vmax=l2zm(0L);
+    new->q1=tree->o;
+    new->q2.flags=0;
+    new->typf=block_vla[nesting]->vtyp->flags;
+    new->q2.val.vmax=sizetab[new->typf];
+    add_IC(new);
+    free_expression(tree);
+  }
+
+  /* make room on the stack */
+  ds=new_node();
+  ds->flags=IDENTIFIER;
+  ds->identifier=empty;
+  ds->dsize=vlength_szof(v->vtyp);
+  ds->val.vmax=l2zm(0L);
+  ds->ntyp=clone_typ(ds->dsize->vtyp);
+  ds->o.flags=VAR;
+  ds->o.v=ds->dsize;
+  ds->o.val.vmax=l2zm(0L);
+  ds->left=ds->right=0;
+
+  if(!find_ext_var("__allocvla")){
+    /* declare function */
+    struct_declaration *sd=mymalloc(sizeof(*sd));
+    type *t=new_typ();
+    sd->count=1;
+    sd->sl=mymalloc(sizeof(struct_list));
+    (*sd->sl)[0].storage_class=AUTO;
+    (*sd->sl)[0].styp=clone_typ(ds->dsize->vtyp);
+    (*sd->sl)[0].reg=ALLOCVLA_REG;
+    t->flags=FUNKT;
+    t->exact=add_sd(sd,FUNKT);
+    t->next=new_typ();
+    t->next->flags=POINTER_TYPE(v->vtyp);
+    t->next->next=new_typ();
+    t->next->next->flags=v->vtyp->flags;
+    fv=add_var("__allocvla",t,EXTERN,0);
+    fv->fi=new_fi();
+    fv->fi->flags|=(ALL_USES|ALL_MODS);
+    fv->fi->inline_asm=mystrdup(ALLOCVLA_INLINEASM);
+  }
+
+  if(!type_expression(ds,0)) ierror(0);
+  tree=gen_libcall("__allocvla",ds,0,0,0);
+  new=new_IC();
+  new->code=ASSIGN;
+  new->z.flags=VAR;
+  new->z.v=v;
+  new->z.val.vmax=l2zm(0L);
+  new->q1=tree->o;
+  new->q2.flags=0;
+  new->typf=POINTER_TYPE(v->vtyp);
+  new->q2.val.vmax=sizetab[new->typf];
+  add_IC(new);
+  free_expression(tree);
+  vlas=1;
+}
+
+/* reset sp to remove variable-length-arrays */
+void freevl(void)
+{
+  np tree,ds;
+  Var *fv;
+  dontdelete=1; /* never remove them, otherwise, fix_vla_jump get confused */
+  if(!find_ext_var("__resetvlasp")){
+    struct_declaration *sd=mymalloc(sizeof(*sd));
+    type *t=new_typ();
+    sd->count=1;
+    sd->sl=mymalloc(sizeof(struct_list));
+    (*sd->sl)[0].storage_class=AUTO;
+    (*sd->sl)[0].styp=clone_typ(block_vla[nesting]->vtyp);
+    (*sd->sl)[0].reg=FREEVLA_REG;
+    t->flags=FUNKT;
+    t->exact=add_sd(sd,FUNKT);
+    t->next=new_typ();
+    t->next->flags=VOID;
+    fv=add_var("__resetvlasp",t,EXTERN,0);
+    fv->fi=new_fi();
+    fv->fi->flags|=(ALL_USES|ALL_MODS);
+    fv->fi->inline_asm=mystrdup(FREEVLA_INLINEASM);
+  }
+  if(nesting==1){
+    clear_main_ret();
+    gen_label(return_label);
+    did_return_label=1;
+  }
+  ds=new_node();
+  ds->flags=IDENTIFIER;
+  ds->identifier=empty;
+  ds->dsize=block_vla[nesting];
+  ds->val.vmax=l2zm(0L);
+  ds->ntyp=clone_typ(ds->dsize->vtyp);
+  ds->left=ds->right=0;
+  ds->o.flags=VAR;
+  ds->o.v=ds->dsize;
+  ds->o.val.vmax=l2zm(0L);
+  if(!type_expression(ds,0)) ierror(0);
+  tree=gen_libcall("__resetvlasp",ds,0,0,0);
+  free_expression(tree);
+  dontdelete=0;
+}  
+
+void clearvl(void)
+{
+  llist *p,*n;
+  vlaadjust_list *vl,*vn;
+  /* look for stack-adjusts that have to be removed */
+  vl=vlaadjusts[nesting];
+  while(vl){
+    int ln;
+    IC *ic=vl->branch;
+    if(ic){
+      ln=ic->typf;
+      if(ic->code!=BRA) ierror(0);
+      p=vladeflabels[nesting];
+      while(p){
+	if(p->label==ln) break;
+	p=p->next;
+      }
+      if(!p){
+	ic=ic->prev;
+	while(ic!=vl->first->prev){
+	  if(!ic) ierror(0);
+	  ic->code=NOP;
+	  ic->q1.flags=ic->q2.flags=ic->z.flags=0;
+	  ic=ic->prev;
+	}
+      }
+    }
+    vn=vl->next;
+    free(vl);
+    vl=vn;
+  }
+  freevl();
+  block_vla[nesting]=0;
+  p=vladeflabels[nesting];
+  while(p){
+    n=p->next;
+    free(p);
+    p=n;
+  }
+  p=vlajmplabels[nesting];
+  while(p){
+    n=p->next;
+    free(p);
+    p=n;
+  }
+  vladeflabels[nesting]=vlajmplabels[nesting]=0;
+  vlaadjusts[nesting]=0;
+}
+
+/* Handle a stack of stored sp variables when traversing an IC list; */
+void vla_nesting(IC *p,Var **vn,int *nest)
+{
+  if(p->code==CALL&&(p->q1.flags&(VAR|DREFOBJ))==VAR&&!strcmp(p->q1.v->identifier,"__oldvlasp")){
+    IC *p2=p->next;
+    while(p2&&(p2->code==ALLOCREG||p2->code==FREEREG)) p2=p2->next;
+    if(!p2||p2->code!=GETRETURN||(p2->z.flags&(VAR|DREFOBJ))!=VAR) ierror(0);
+    /*printf("found save sp to %p\n",p2->z.v);*/
+    vn[*nest]=p2->z.v;
+    (*nest)++;
+    vn[*nest]=0;
+    if(*nest>=MAXN) ierror(0);
+    return;
+  }
+  if(p->code==CALL&&(p->q1.flags&(VAR|DREFOBJ))==VAR&&!strcmp(p->q1.v->identifier,"__resetvlasp")){ 
+    /*printf("found reset\n");*/
+    if(*nest<=0) ierror(0);
+    (*nest)--;
+    return;
+  }
+}
+
+static int return_vla_nest;
+static Var *return_last_vlasp;
+
+/* Find the stack pointer that is needed when jumping to label lab */
+Var *vla_find_sp(int lab)
+{
+  IC *p;int nest=0;
+  static Var *vn[MAXN];
+  for(p=first_ic;p;p=p->next){
+    if(p->code==LABEL&&p->typf==lab){
+      return_vla_nest=nest;
+      return_last_vlasp=vn[nest];
+      if(nest<=0)
+	return 0;
+      else
+	return vn[nest-1];
+    }
+    vla_nesting(p,vn,&nest);
+  }
+  ierror(0);
+}
+
+void vla_jump_fix(void)
+{
+  IC *p;int nest=0;
+  static Var *vn[MAXN],*savedsp;
+  if(DEBUG&1) printf("searching for vla-jump-fixes\n");
+  for(p=first_ic;p;p=p->next){
+    /*pric2(stdout,p);*/
+    if(p->code>=BEQ&&p->code<=BRA){
+      /*printf("jump found\n");*/
+      p->savedsp=0;
+      if(1/*nest>0*/){
+	/*printf("is in vla context!\n");*/
+	savedsp=vla_find_sp(p->typf);
+	if(return_vla_nest>nest||(nest>0&&return_vla_nest==nest&&savedsp!=vn[nest-1])){
+	  err_ic=p;
+	  error(351);
+	}else if(nest==0||savedsp==vn[nest-1]){
+	  /*printf("jump within the same context\n");*/
+	}else{
+	  if(vn[nest]){
+	    if(DEBUG&1) printf("have to set sp to %p\n",return_last_vlasp);
+	    p->savedsp=return_last_vlasp;
+	  }else{
+	    int ndiff=nest-return_vla_nest-1;
+	    IC *p2;
+	    /*printf("have to search oldsp ndiff=%d\n",ndiff);*/
+	    for(p2=p->prev;p2;p2=p2->prev){
+	      if(p2->code==CALL&&(p2->q1.flags&(VAR|DREFOBJ))==VAR&&!strcmp(p2->q1.v->identifier,"__oldvlasp")){
+		if(ndiff==0){
+		  /*printf("found savesp\n");*/
+		  p2=p2->next;
+		  while(p2&&(p2->code==ALLOCREG||p2->code==FREEREG)) p2=p2->next;
+		  if(!p2||p2->code!=GETRETURN) ierror(0);
+		  if((p2->z.flags&(VAR|DREFOBJ))!=VAR) ierror(0);
+		  /*printf("found oldsp %p\n",p2->z.v);*/
+		  p->savedsp=p2->z.v;
+		  break;
+		}
+		ndiff--;
+	      }
+	      if(p2->code==CALL&&(p2->q1.flags&(VAR|DREFOBJ))==VAR&&!strcmp(p2->q1.v->identifier,"__resetvlasp")){
+		ndiff++;
+	      }
+	    }
+	    if(!p2) ierror(0);
+	  }
+	}
+      }else{
+	/*printf("not in vla context\n");*/
+      }
+    }
+    vla_nesting(p,vn,&nest);
+  }
+  for(p=first_ic;p;p=p->next){
+    if(p->code>=BEQ&&p->code<=BRA){  
+      if(p->savedsp){
+	IC *merkfic,*merklic,*newcode,*m,*new,*setr=0;
+	np ds,tree;
+	if(DEBUG&1) printf("generating sp-adjust\n");
+        merkfic=first_ic;merklic=last_ic;
+	first_ic=0;last_ic=0;
+	ds=new_node();
+	ds->flags=IDENTIFIER;
+	ds->identifier=empty;
+	ds->dsize=p->savedsp;
+	ds->val.vmax=l2zm(0L);
+	ds->ntyp=clone_typ(ds->dsize->vtyp);
+	ds->left=ds->right=0;
+	ds->o.flags=VAR;
+	ds->o.v=ds->dsize;
+	ds->o.val.vmax=l2zm(0L);
+	if(!type_expression(ds,0)) ierror(0);
+	tree=gen_libcall("__resetvlasp",ds,0,0,0);
+	free_expression(tree);
+	newcode=first_ic;
+	first_ic=merkfic;last_ic=merklic;
+	if(p->code==BRA){
+	  /* check if the branch was preceded by a SETRETURN */
+	  IC *p2=p->prev;
+	  while(p2&&(p2->code==FREEREG||p2->code==ALLOCREG))
+	    p2=p2->prev;
+	  if(p2->code==SETRETURN&&p2->z.reg)
+	    setr=p2;
+	}else{
+	  new=new_IC();
+	  new->typf=++label;
+	  if(p->code==BEQ) new->code=BRA;
+	  else if(p->code==BNE) new->code=BEQ;
+	  else if(p->code==BLT) new->code=BGE;
+	  else if(p->code==BGT) new->code=BLE;
+	  else if(p->code==BLE) new->code=BGT;
+	  else if(p->code==BGE) new->code=BLT;
+	  insert_IC(p->prev,new);
+	}
+	while(newcode){
+	  m=newcode->next;
+	  insert_IC(p->prev,newcode);
+	  newcode=m;
+	}
+	if(p->code!=BRA){
+	  p->code=BRA;
+	  new=new_IC();
+	  new->code=LABEL;
+	  new->typf=label;
+	  insert_IC(p,new);
+	}
+	if(setr){
+	  /* save the return value to save it from being overwritten */
+	  /* could be optimized further */
+	  Var *v;
+	  if(ISSCALAR(setr->typf)){
+	    static type t={0};
+	    t.flags=setr->typf;
+	    v=add_tmp_var(clone_typ(&t));
+	  }else ierror(0);
+	  new=new_IC();
+	  *new=*setr;
+	  new->q1.flags=VAR;
+	  new->q1.v=v;
+	  new->q1.val.vmax=l2zm(0L);
+	  setr->z=new->q1;
+	  setr->code=ASSIGN;
+	  insert_IC(p->prev,new);
+	}
+      }
+    }
+  }
+}  
+  
+
+Var *add_tmp_var(type *t)
+{
+  t->flags&=NU;
+  return add_var(empty,t,AUTO,0);
+}
+Var *add_var(char *identifier, type *t, int storage_class,const_list *clist)
+/*  Fuegt eine Variable mit Typ in die var_list ein.            */
+/*  In der storage_class werden die Flags PARAMETER und evtl.   */
+/*  OLDSTYLE und REGPARM erkannt.                               */
+{
+  Var *new;int f;
+  struct_declaration *sd;
+  static zmax paroffset;
+  zmax al;
+  /*if(*identifier==0) return;*/ /* sollte woanders bemaekelt werden */
+  if(DEBUG&2) printf("add_var(): %s\n",identifier);
+#ifdef HAVE_TARGET_VARHOOK_PRE
+  add_var_hook_pre(identifier,t,storage_class,clist);
+#endif
+#ifdef HAVE_MISRA
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+  if(ISFUNC(t->flags&NQ)&&(ISARRAY(t->next->flags)||ISFUNC(t->next->flags)))
+    error(25);
+  new=mymalloc(sizeof(Var));
+  if(!*identifier&&identifier!=empty) ierror(0);
+  new->clist=clist;
+  new->vtyp=t;
+  new->storage_class=storage_class&PLAIN_STORAGE_CLASS;
+  new->reg=0;
+  new->vattr=0;
+  new->next=0;
+  new->flags=0;
+  new->inr=0;
+  new->fi=0;
+  new->nesting=nesting;
+  new->filename=filename;
+  new->line=line;
+  new->dfilename=0;
+  new->dline=0;
+  new->description=0;
+  new->tunit=last_tunit;
+  new->inline_copy=0;
+  new->index=-1;
+#ifdef HAVE_TARGET_ATTRIBUTES
+  new->tattr=0;
+#endif
+  /*    if((storage_class&PLAIN_STORAGE_CLASS)==STATIC||(storage_class&PLAIN_STORAGE_CLASS)==EXTERN) new->flags=USEDASSOURCE|USEDASDEST;*/
+  if(DEBUG&2) printf("storage_class=%d\n",storage_class);
+  if(storage_class&PARAMETER) new->flags|=USEDASDEST;
+  if(storage_class&REGPARM){
+    new->flags|=REGPARM;
+    if(!(storage_class&DBLPUSH)){
+      if((storage_class&OLDSTYLE)&&(t->flags&NQ)==FLOAT)
+	new->flags|=CONVPARAMETER;
+      storage_class&=~PARAMETER;
+    }
+  }
+  if(DEBUG&2) printf("storage_class=%d\n",storage_class);
+  if(DEBUG&2) printf("max_offset=%ld\n",zm2l(max_offset));
+  if(is_vlength(t)&&storage_class!=AUTO&&storage_class!=REGISTER)
+    error(315);
+  if((storage_class&PLAIN_STORAGE_CLASS)==REGISTER) new->priority=registerpri; else new->priority=0;
+  if(/*nesting==0&&*/new->storage_class==EXTERN){
+    int m=nesting;
+    nesting=0;
+    new->identifier=add_identifier(identifier,strlen(identifier));
+    nesting=m;
+    if(last_ext){
+      last_ext->next=new;
+      last_ext=new;
+    }else{
+      first_ext=last_ext=new;
+      vl0=first_ext;
+    }
+    if(hash_ext) add_hashentry(hash_ext,new->identifier,new);
+  }else{
+    new->identifier=add_identifier(identifier,strlen(identifier));
+    if(last_var[nesting]){
+      new->offset=zmadd(last_var[nesting]->offset,szof(last_var[nesting]->vtyp));
+      last_var[nesting]->next=new;
+      last_var[nesting]=new;
+    }else{
+      new->offset=l2zm(0L);
+      paroffset=l2zm(0L);;
+      first_var[nesting]=last_var[nesting]=new;
+      if(nesting==0) vl1=new;
+      if(nesting==1) vl2=new;
+    }
+  }
+  f=t->flags&NQ;
+  if((storage_class&PLAIN_STORAGE_CLASS)==AUTO||(storage_class&PLAIN_STORAGE_CLASS)==REGISTER){
+    if(DEBUG&2) printf("auto\n");
+    al=falign(t);
+    if((c_flags_val[0].l&2)&&nesting==1&&!(storage_class&PARAMETER)){
+      new->offset=max_offset;
+    }else{
+      if(storage_class&PARAMETER){
+        new->offset=paroffset;
+	if(align_arguments)
+	  new->offset=zmmult(zmdiv(zmadd(new->offset,zmsub(al,l2zm(1L))),al),al);
+      }else{
+        new->offset=local_offset[nesting];
+	new->offset=zmmult(zmdiv(zmadd(new->offset,zmsub(al,l2zm(1L))),al),al);
+      }
+    }
+    if(storage_class&PARAMETER){
+      new->offset=zmmult(zmdiv(zmadd(new->offset,zmsub(stackalign,l2zm(1L))),stackalign),stackalign);
+      if(ISINT(f)&&f<INT&&!short_push){
+        /*  Integer-Erweiterungen fuer alle Funktionsparameter  */
+        paroffset=zmadd(new->offset,sizetab[INT]);
+      }else{
+        if(f==FLOAT&&(storage_class&OLDSTYLE)){
+          /*  Bei alten Funktionen werden FLOAT als DOUBLE uebergeben */
+          new->offset=zmmult(zmdiv(zmadd(new->offset,zmsub(align[DOUBLE],l2zm(1L))),align[DOUBLE]),align[DOUBLE]);
+          paroffset=zmadd(new->offset,sizetab[DOUBLE]);
+        }else{
+          paroffset=zmadd(new->offset,szof(new->vtyp));
+        }
+      }
+    }else{
+      local_offset[nesting]=zmadd(new->offset,szof(new->vtyp));
+    }
+    if(!(storage_class&PARAMETER))
+      if(zmleq(max_offset,local_offset[nesting])) max_offset=local_offset[nesting];
+    if(DEBUG&2) printf("max_offset=%ld\n",zm2l(max_offset));
+  }
+  if((storage_class&PLAIN_STORAGE_CLASS)==STATIC) new->offset=l2zm((long)++label);
+  if(storage_class&PARAMETER){
+
+    if(DEBUG&2) printf("parameter\n");
+
+    if(ISINT(f)&&f<INT&&!zmleq(sizetab[INT],sizetab[f])){
+      if(BIGENDIAN){
+        new->offset=zmadd(new->offset,zmsub(sizetab[INT],sizetab[f]));
+      }else{
+        if(!LITTLEENDIAN)
+          ierror(0);
+      }
+    }
+    if((storage_class&OLDSTYLE)&&f==FLOAT){
+      /*  Bei alten Funktionen werden DOUBLE nach FLOAT konvertiert   */
+      if(!(storage_class&REGPARM)){
+#if HAVE_LIBCALLS
+	static type dt={DOUBLE},ft={FLOAT};
+	static node n,nn;
+	IC *conv=new_IC();
+	n.flags=REINTERPRET;
+	n.left=&nn;
+	n.ntyp=&dt;
+	nn.flags=IDENTIFIER;
+	nn.identifier=identifier;
+	nn.ntyp=&ft;
+	nn.o.flags=VAR|DONTREGISTERIZE;
+	nn.o.v=new;
+	nn.o.val.vmax=l2zm(0L);
+	n.o=nn.o;
+	convert(&n,FLOAT);
+	
+
+	conv->code=ASSIGN;
+	conv->typf=FLOAT;
+	conv->q1=n.o;
+	conv->z.v=new;
+	conv->z.flags=VAR;
+	conv->z.val.vmax=l2zm(0L);
+	conv->q2.val.vmax=sizetab[FLOAT];
+	conv->z.v=new;
+	add_IC(conv);	
+#else
+	IC *conv=new_IC();
+	conv->code=CONVERT;
+	conv->typf=FLOAT;
+	conv->typf2=DOUBLE;
+	conv->q1.flags=VAR|DONTREGISTERIZE;
+	conv->z.flags=VAR;
+	conv->q2.flags=0;
+	conv->q1.v=conv->z.v=new;
+	conv->q1.val.vmax=conv->z.val.vmax=l2zm(0);
+	add_IC(conv);
+#endif
+      }
+      new->flags|=CONVPARAMETER;
+    }
+    new->offset=zmsub(l2zm(0L),zmadd(maxalign,new->offset));
+  }
+  if((storage_class&PLAIN_STORAGE_CLASS)==EXTERN){
+    if(!strcmp("fprintf",identifier)) new->flags|=PRINTFLIKE;
+    if(!strcmp("printf",identifier))  new->flags|=PRINTFLIKE;
+    if(!strcmp("sprintf",identifier)) new->flags|=PRINTFLIKE;
+    if(!strcmp("fscanf",identifier))  new->flags|=SCANFLIKE;
+    if(!strcmp("scanf",identifier))   new->flags|=SCANFLIKE;
+    if(!strcmp("sscanf",identifier))  new->flags|=SCANFLIKE;
+  }
+  if(is_vlength(new->vtyp))
+    create_allocvl(new);
+#ifdef HAVE_TARGET_VARHOOK_POST
+  add_var_hook_post(new);
+#endif
+  return(new);
+}
+void free_var(Var *p)
+/*  Gibt Variablenliste inkl. Typ, aber ohne Identifier frei.   */
+{
+  Var *merk;
+  while(p){
+    if(!*p->identifier&&p->identifier!=empty) ierror(0);
+    free(p->description);
+    free(p->vattr);
+    merk=p->next;
+    if(!(p->flags&USEDASADR)&&(p->storage_class==AUTO||p->storage_class==REGISTER)){
+      if(*p->identifier&&!(p->flags&USEDASDEST)&&ISSCALAR(p->vtyp->flags)) error(64,p->identifier);
+      if(*p->identifier&&!(p->flags&USEDASSOURCE)&&ISSCALAR(p->vtyp->flags)) error(65,p->identifier);
+    }
+    if(DEBUG&2) printf("free_var %s, pri=%d\n",p->identifier,p->priority);
+    if(p->vtyp) freetyp(p->vtyp);
+    if(p->clist) free_clist(p->clist);
+    if(p->fi){
+      if(DEBUG&2) printf("free_fi of function %s\n",p->identifier);
+      free_fi(p->fi);
+      if(DEBUG&2) printf("end free_fi of function %s\n",p->identifier);
+    }
+    free(p);
+    p=merk;
+  }
+}
+Var *find_ext_var(char *identifier)
+{
+  Var *v;int l;
+  if(misracheck) l=strlen(identifier);
+  if(hash_ext) return find_name(hash_ext,identifier);
+  for(v=first_ext;v;v=v->next){
+    if(!strcmp(v->identifier,identifier)) return v;
+#ifdef HAVE_MISRA
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+
+  }
+  return 0;
+}
+Var *find_var(char *identifier,int endnesting)
+/*  Sucht Variable mit Bezeichner und liefert Zeiger zurueck    */
+/*  es werden nur Variablen der Bloecke endnesting-nesting      */
+/*  durchsucht.                                                 */
+{
+  int i,l;Var *v;
+  if(identifier==0||*identifier==0) return 0;
+  if(misracheck) l=strlen(identifier);
+  for(i=nesting;i>=endnesting;i--){
+    for(v=first_var[i];v;v=v->next){
+      if(!strcmp(v->identifier,identifier))
+	return v;
+#ifdef HAVE_MISRA
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+    }
+  }
+  if(endnesting==0){
+    v=find_ext_var(identifier);
+    if(v&&!(v->flags&NOTINTU))
+      return v;
+    else
+      return 0;
+  }else
+    return 0;
+}
+
+
+#ifdef HAVE_MISRA
+/* removed */
+/* removed */
+#endif
+
+
+
+int check_zero_initialisation(const_list* cl, int typ) 
+{
+  
+  if (cl->next) return 0;
+  if (cl->tree) return 0;
+  if (cl->other)  {
+    return check_zero_initialisation(cl->other,typ);
+  } else {
+    eval_const(&cl->val,typ);
+    if ( (zmeqto(vmax,l2zm(0L))) && (zumeqto(vumax,ul2zum(0UL))) && (zldeqto(vldouble,d2zld(0.0))) ) {
+      return 1;
+    }
+  }
+  return 0;
+}
+
+/* decide whether a initialization shall be performed only be generated code
+   or if a table copy should be used first */
+int use_only_dyn_init(zmax sz,zmax dyn_sz,zmax const_sz,int dyn_cnt,int const_cnt)
+{
+  if(zmleq(sz,l2zm(clist_copy_stack)))
+    return 1;
+  if(zmeqto(dyn_sz,l2zm(0L)))
+    return 0;
+  if(!zmleq(zmdiv(sz,dyn_sz),l2zm(2L)))
+    return 0;
+  else
+    return 1;
+}
+
+void init_local_compound(Var *v)
+{
+  if(v->storage_class==AUTO||v->storage_class==REGISTER){
+    IC *new;
+    /*  Initialisierung von auto-Variablen  */
+    new=new_IC();
+    new->code=ASSIGN;
+    new->typf=v->vtyp->flags;
+    new->q2.flags=0;
+    new->q2.val.vmax=szof(v->vtyp);
+    new->z.flags=VAR;
+    new->z.v=v;
+    new->z.val.vmax=l2zm(0L);
+    if(v->clist->tree){
+      /*  einzelner Ausdruck  */
+      gen_IC(v->clist->tree,0,0);
+      convert(v->clist->tree,v->vtyp->flags&NU);
+      new->q1=v->clist->tree->o;
+      add_IC(new);
+      /*                        v->clist=0;*/
+    }else{
+      /*  Array etc.  */
+      Var *nv;
+      if(!ISSCALAR(v->vtyp->flags)&&!use_only_dyn_init(szof(v->vtyp),init_dyn_sz,init_const_sz,init_dyn_cnt,init_const_cnt)){
+	nv=add_var(empty,clone_typ(v->vtyp),STATIC,v->clist);
+	nv->flags|=DEFINED;
+	nv->dfilename=filename;
+	nv->dline=line;
+	nv->vtyp->flags|=CONST;
+	/*                        v->clist=0;*/
+	new->q1.flags=VAR;
+	new->q1.v=nv;
+	new->q1.val.vmax=l2zm(0L);
+
+	add_IC(new);
+	
+	dynamic_init(v,v->vtyp,v->clist,0,1);
+      }else{
+	dynamic_init(v,v->vtyp,v->clist,0,0);
+      }
+    }   
+  }
+}
+
+#ifdef HAVE_MISRA
+/* removed */
+/* removed */
+/* removed */
+#endif
+
+void var_declaration(void)
+/*  Bearbeitet eine Variablendeklaration und erzeugt alle       */
+/*  noetigen Strukturen.                                        */
+{
+  type *ts,*t,*old=0,*om=0;char *imerk,vident[MAXI];
+  int mdef=0,makeint=0,notdone,storage_class,msc,extern_flag,isfunc,
+    had_decl,hard_reg,mhr,diffunit=0,inline_flag;
+  Var *v;
+  char *vattr;
+  zumax mask;
+  int base_type;
+#ifdef HAVE_TARGET_ATTRIBUTES
+  unsigned long tattr;
+#endif
+#ifdef HAVE_ECPP
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+  ts=declaration_specifiers();notdone=1;
+
+  storage_class=return_sc;hard_reg=return_reg;vattr=return_vattr;mask=return_mask;
+  inline_flag=return_inline;
+#ifdef HAVE_ECPP
+/* removed */
+#endif
+  if(for_decl&&storage_class!=0&&storage_class!=AUTO&&storage_class!=REGISTER){
+    error(299);
+    storage_class=AUTO;
+  }
+
+#ifdef HAVE_TARGET_ATTRIBUTES
+  tattr=return_tattr;
+#endif
+  if(storage_class==EXTERN) extern_flag=1; else extern_flag=0;
+  killsp();
+  if(ctok->type==SEMIC){
+    if(!ts) error(0);
+    if(storage_class||(!ISSTRUCT(ts->flags)&&!ISUNION(ts->flags)&&(ts->flags&NQ)!=INT))
+      error(36);
+    freetyp(ts);
+    next_token();killsp();
+    return;
+  }
+  if(nesting==0&&(storage_class==AUTO||storage_class==REGISTER))
+    {error(66);storage_class=EXTERN;}
+  if(!ts){
+    if(nesting<=1){
+      ts=new_typ();
+      ts->flags=INT;ts->next=0;
+      makeint=1;
+      if(!storage_class) storage_class=EXTERN;
+#ifdef HAVE_MISRA
+/* removed */
+#endif
+      error(67);
+    }else{
+      error(365);
+    }
+  }
+  if(storage_class==0){
+    if(nesting==0) 
+      storage_class=EXTERN;
+    else
+      storage_class=AUTO;
+  }
+  msc=storage_class;mhr=hard_reg;
+  while(notdone){
+    int oldnesting=nesting;
+    imerk=ident;ident=vident;*vident=0;  /* merken von ident hier vermutlich */
+    storage_class=msc;hard_reg=mhr;
+    if(old) {freetyp(old);old=0;}
+    t=declarator(clone_typ(ts));
+#ifdef HAVE_ECPP
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+#ifdef HAVE_EXT_TYPES
+    conv_typ(t);
+#endif
+    if(!ISFUNC(t->flags)){
+        isfunc=0;
+        if(inline_flag) error(301);
+    }else{
+        isfunc=1;
+#ifdef HAVE_MISRA
+/* removed */
+#endif
+        if(storage_class!=STATIC&&storage_class!=TYPEDEF) storage_class=EXTERN;
+    }
+    ident=imerk;                    /* nicht unbedingt noetig ?         */
+    if(!*vident){
+      free(ts);free(t);
+      error(36);return;
+    }
+    v=find_var(vident,oldnesting);
+    if(!v&&/*oldnesting==0&&*/storage_class==EXTERN&&cross_module&&(v=find_ext_var(vident))){
+      v->flags&=~NOTINTU;
+      diffunit=1;
+      /*FIXME: check auf doppelte Def. */
+    }
+#ifdef HAVE_MISRA
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+    if(v){
+      had_decl=1;
+      if(storage_class==TYPEDEF){
+        error(226,v->identifier);
+      }else{
+        if(nesting>0&&(v->flags&DEFINED)&&!extern_flag&&!isfunc){
+          error(27,vident);
+        }else{
+          if(t&&v->vtyp&&!compatible_types(v->vtyp,t,NU|CONST|VOLATILE)){
+	    if(ISFUNC(t->flags)&&!ISFUNC(v->vtyp->flags))
+	      error(361,vident);
+	    else
+	      error(68,vident);
+#ifdef HAVE_MISRA
+/* removed */
+#endif
+          }
+          if((storage_class!=v->storage_class&&!extern_flag)||hard_reg!=v->reg)
+            error(28,v->identifier);
+          if(!isfunc&&!extern_flag) v->flags|=TENTATIVE;
+        }
+#ifdef HAVE_TARGET_ATTRIBUTES
+        {
+          int i;
+          for(i=0;g_attr_name[i];i++){
+            if((v->tattr&(1L<<i))!=(tattr&(1L<<i))) error(228,vident,g_attr_name[i]);
+          }
+          v->tattr=tattr;
+        }
+#endif
+        if(vattr){
+	  if(!v->vattr||!strstr(v->vattr,vattr)){
+	    error(370,v->identifier,vattr,v->vattr?v->vattr:empty);
+	    add_attr(&v->vattr,vattr);
+	  }
+          if(ISFUNC(v->vtyp->flags)) fi_from_attr(v);
+        }
+        if(!isfunc){
+          if(!ISARRAY(t->flags)||!zmeqto(t->size,l2zm(0L))){
+            free(v->vtyp);
+            v->vtyp=t;
+          }
+        }else{
+          om=v->vtyp;
+          if(t->exact->count>0){
+            old=v->vtyp;v->vtyp=t;
+          }
+        }
+      }
+#ifdef HAVE_TARGET_VARHOOK_POST
+      add_attr_haddecl=v;
+      add_var_hook_post(v);
+      add_attr_haddecl=0;
+#endif
+      
+    }else{
+      had_decl=0;
+#ifdef HAVE_MISRA
+/* removed */
+#endif
+      if(isfunc&&ctok->type!=COMMA&&ctok->type!=SEMIC&&ctok->type!=RPAR&&ctok->type!=ASGN&&nesting>0) nesting--;
+      if(!zumeqto(mask,ul2zum(0UL))){
+	sprintf(vident+strlen(vident),".%lu",zum2ul(mask));
+      }
+      v=add_var(vident,t,storage_class,0);
+#ifdef HAVE_ECPP
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+      v->reg=hard_reg;
+      if(vattr)
+	add_attr(&v->vattr,vattr);
+      if(ISFUNC(v->vtyp->flags))
+        fi_from_attr(v);
+#ifdef HAVE_TARGET_ATTRIBUTES
+      v->tattr=tattr;
+#endif
+      if(isfunc&&ctok->type!=COMMA&&ctok->type!=SEMIC&&ctok->type!=RPAR&&ctok->type!=ASGN&&nesting>=0) nesting++;
+      if(!v) ierror(0);
+      else{
+        if(!isfunc&&!extern_flag){
+          v->flags|=TENTATIVE;
+          if(nesting>0){
+            v->flags|=DEFINED;
+            v->dfilename=filename;
+            v->dline=line;
+          }
+        }
+      }
+      om=0;
+    }
+    if(isfunc&&inline_flag){
+      v->flags|=INLINEFUNC;
+      if(extern_flag) v->flags|=INLINEEXT;
+    }
+#ifdef HAVE_MISRA
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+    if(disallow_statics&&v->storage_class==STATIC&&*v->identifier&&!is_const(v->vtyp))
+      error(302,v->identifier);
+    killsp();
+    /*  Inline-Assembler-Code in Funktionsdeklarationen */
+    if(ctok->type==ASGN&&ISFUNC(v->vtyp->flags)&&(header_cnt>0||!(c_flags[7]&USEDFLAG))){
+      np tree;
+      next_token();killsp();
+      if(v->fi){free(v->fi->inline_asm);v->fi->inline_asm=0;}
+      if(!v->fi) v->fi=new_fi();
+      v->fi->inline_asm=get_string();
+      /*STRBACK(v->fi->inline_asm);*/
+      mdef=1;
+    }else{
+      /*if(v->fi){free(v->fi->inline_asm);v->fi->inline_asm=0;}*/
+    }
+    /*  Initialisierung von Variablen bei Deklaration   */
+    if(ctok->type==ASGN){
+
+      next_token();killsp();
+      if(!had_decl&&v->nesting==0&&v->storage_class==EXTERN&&strcmp("main",v->identifier))
+        error(168,v->identifier);
+      if(v->flags&DEFINED){
+        if(nesting==0) error(30,v->identifier);
+      }else{
+        v->flags|=DEFINED;
+        v->dfilename=filename;
+        v->dline=line;
+#ifdef HAVE_MISRA
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+      }
+      if(v->storage_class==TYPEDEF) error(114,v->identifier);
+      if(extern_flag){
+        if(nesting==0)
+          error(118,v->identifier);
+        else
+          error(207,v->identifier);
+        if(v->storage_class!=EXTERN){ error(77);v->storage_class=EXTERN;}
+      }
+#ifdef HAVE_MISRA
+/* removed */
+/* removed */
+#endif
+      init_dyn_sz=l2zm(0L);
+      init_dyn_cnt=0;
+      init_const_sz=l2zm(0L);
+      init_const_cnt=0;
+      v->clist=initialization(v->vtyp,v->storage_class==AUTO||v->storage_class==REGISTER,0,0,0,0);
+                /* MISRA Rule 9.2 violation checking and error reporting */
+#ifdef HAVE_MISRA
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+      if(v->clist){
+        if(ISARRAY(v->vtyp->flags)&&zmeqto(v->vtyp->size,l2zm(0L))){
+          const_list *p=v->clist;
+          while(p){v->vtyp->size=zmadd(p->idx,l2zm(1L));p=p->next;}
+          if(v->storage_class==AUTO||v->storage_class==REGISTER){
+            local_offset[nesting]=zmadd(local_offset[nesting],szof(v->vtyp));
+            if(zmleq(max_offset,local_offset[nesting])) max_offset=local_offset[nesting];
+          }
+        }
+        if(v->storage_class==AUTO||v->storage_class==REGISTER){
+
+	  init_local_compound(v);
+
+        }else if(c_flags[19]&USEDFLAG){
+          /*  Ohne Optimierung gleich erzeugen; das ist noch  */
+          /*  etwas von der genauen Implementierung der Liste */
+          /*  der Variablen abhaengig.                        */
+          Var *merk=v->next;
+          v->next=0;
+          gen_vars(v);
+          v->next=merk;
+          v->clist=0;
+        }
+      }
+    }else{
+      if((v->flags&DEFINED)&&type_uncomplete(v->vtyp)) error(202,v->identifier);
+      if((v->vtyp->flags&CONST)&&(v->storage_class==AUTO||v->storage_class==REGISTER))
+        error(119,v->identifier);
+    }
+    if(ctok->type==COMMA) {next_token();killsp();mdef=1;} else notdone=0;
+  }
+  freetyp(ts);
+
+  if(ISFUNC(t->flags)&&v->reg)
+    t->next->reg=v->reg;
+
+  if(!mdef&&t&&(t->flags&NQ)==FUNKT&&ctok->type!=SEMIC){
+    /*  Funktionsdefinition*/
+    int i,oldstyle=0;
+
+#ifdef HAVE_MISRA
+/* removed */
+/* removed */
+#endif
+#ifdef HAVE_REGPARMS
+    treg_handle reg_handle;
+#endif
+    if(DEBUG&1) printf("Funktionsdefinition! %s %p\n",v->identifier,(void *)v);
+    {
+      int i;
+      for(i=1;i<=MAXR;i++) {regs[i]=regused[i]=regsa[i];regsbuf[i]=0;}
+    }
+    cur_func=v->identifier;
+    cur_funcv=v;
+    if(only_inline==2) only_inline=0;
+    if(nesting<1) enter_block();
+    if(nesting>1) error(32);
+    if(v->flags&DEFINED){
+      if(!inline_flag||!cross_module){
+                                error(33,v->identifier);
+      }else{
+        if(v->fi->first_ic){
+          free_IC(v->fi->first_ic);
+          v->fi->first_ic=0;
+        }
+      }
+    }else{
+      v->flags|=DEFINED;
+      v->dfilename=filename;
+      v->dline=line;
+#ifdef HAVE_MISRA
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+    }
+    if(storage_class!=EXTERN&&storage_class!=STATIC) error(34);
+    if(extern_flag&&!inline_flag) error(120);
+    if(storage_class==EXTERN&&!strcmp(v->identifier,"main")&&(!t->next||t->next->flags!=INT)) error(121);
+    if(!had_decl&&v->nesting==0&&v->storage_class==EXTERN&&strcmp("main",v->identifier))
+      error(168,v->identifier);
+    while(!ecpp&&ctok->type!=LBRA){
+      /*  alter Stil  */
+      type *nt=declaration_specifiers();notdone=1;oldstyle=OLDSTYLE;
+      if(!ts) {error(35);}
+      while(notdone){
+        int found=0;
+        imerk=ident;ident=vident;*vident=0;
+        ts=declarator(clone_typ(nt));
+        ident=imerk;
+        if(!ts) {error(36);}
+        else{
+          for(i=0;i<t->exact->count;i++){
+            if(!strcmp((*t->exact->sl)[i].identifier,vident)){
+              found=1;
+              if((*t->exact->sl)[i].styp){
+                error(69,vident);
+                freetyp((*t->exact->sl)[i].styp);
+              }
+              /*  typ[] in *typ   */
+              if(ISARRAY(ts->flags)) ts->flags=POINTER_TYPE(ts);
+              /*  typ() in *typ() */
+              if(ISFUNC(ts->flags)){
+                type *new=new_typ();
+                new->flags=POINTER_TYPE(ts);
+                new->next=ts;
+                ts=new;
+              }
+              if(!return_sc) return_sc=AUTO;
+              if(return_sc!=AUTO&&return_sc!=REGISTER)
+                {error(122);return_sc=AUTO;}
+              (*t->exact->sl)[i].storage_class=return_sc;
+              (*t->exact->sl)[i].reg=return_reg;
+              if(return_reg) error(219);
+              (*t->exact->sl)[i].styp=ts;
+            }
+          }
+        }
+        if(!found) {error(37,vident);}
+        killsp();
+        if(ctok->type==COMMA) {next_token();killsp();} else notdone=0;
+      }
+      if(nt) freetyp(nt);
+      if(ctok->type==SEMIC){
+        next_token();killsp();
+      }else{
+        error(54);
+        while(ctok->type!=LBRA&&ctok->type!=SEMIC){next_token();killsp();}
+      }
+    }
+    if(!ecpp&&t->exact->count==0){
+      struct_list sl[1];
+      if(DEBUG&1) printf("prototype converted to (void)\n");
+      t->exact->count=1;
+      sl[0].identifier=empty;
+      sl[0].storage_class=AUTO;
+      sl[0].styp=new_typ();
+      sl[0].styp->flags=VOID;
+      sl[0].styp->next=0;
+      sl[0].reg=0;
+      nesting--;
+      add_sl(t->exact,&sl);
+      nesting++;
+    }
+    if(om&&om->exact&&!compare_sd(om->exact,t->exact)) {
+      error(123);
+#ifdef HAVE_MISRA
+/* removed */
+#endif
+    }
+    nocode=0;currentpri=1;
+    /*        enter_block();*/
+    local_offset[1]=l2zm(0L);
+    return_var=0;
+    if(!v->vtyp) ierror(0);
+#ifdef HAVE_REGPARMS
+    reg_handle=empty_reg_handle;
+#endif
+    if(v->vtyp->next->flags==VOID){
+      return_typ=0;
+    }else{
+      return_typ=v->vtyp->next;
+      if(!ffreturn(return_typ)&&(return_typ->flags&NQ)!=VOID){
+        /*  Parameter fuer die Rueckgabe von Werten, die nicht in einem */
+        /*  Register sind.                                              */
+        type *rt=new_typ();int reg;
+        rt->flags=POINTER_TYPE(return_typ);rt->next=return_typ;
+#ifdef HAVE_REGPARMS
+        reg=reg_parm(&reg_handle,rt,0,v->vtyp);
+        if(!reg){
+	  return_var=add_var(empty,clone_typ(rt),AUTO|PARAMETER|oldstyle,0);
+	}else{
+	  return_var=add_var(empty,clone_typ(rt),reg<0?(AUTO|PARAMETER|REGPARM|DBLPUSH|oldstyle):(AUTO|PARAMETER|REGPARM|oldstyle),0);
+	  return_var->reg=reg;
+	}
+#else
+        return_var=add_var(empty,clone_typ(rt),AUTO|PARAMETER|oldstyle,0);
+#endif
+        return_var->flags|=DEFINED;
+        return_var->dfilename=filename;
+        return_var->dline=line;
+        free(rt);
+      }
+    }
+    first_ic=last_ic=0;ic_count=0;max_offset=l2zm(0L);
+    if(!zmleq(local_offset[1],Z0)) max_offset=local_offset[1];
+    for(i=0;i<t->exact->count;i++){
+      /* TODO: missing pointer for struct return */
+#ifdef HAVE_REGPARMS
+      int didrp=0;
+      if((*t->exact->sl)[i].styp){
+        int tr;
+        tr=reg_parm(&reg_handle,(*t->exact->sl)[i].styp,0,t);
+        didrp=1;
+        if(!(*t->exact->sl)[i].reg) (*t->exact->sl)[i].reg=tr;
+      }
+#endif
+      if(!(*t->exact->sl)[i].styp&&*(*t->exact->sl)[i].identifier){
+        type *nt;
+#ifdef HAVE_MISRA
+/* removed */
+#endif
+        nt=new_typ();
+        nt->flags=INT;
+        (*t->exact->sl)[i].styp=nt;
+        (*t->exact->sl)[i].storage_class=AUTO;
+        (*t->exact->sl)[i].reg=0;
+        error(124);
+      }
+      if(*(*t->exact->sl)[i].identifier){
+        Var *tmp;int sc,tr;
+        sc=((*t->exact->sl)[i].storage_class|PARAMETER|oldstyle);
+#ifdef HAVE_REGPARMS
+        if(!didrp){
+          if(!t->exact->sl) ierror(0);
+          if(!(*t->exact->sl)[i].styp) ierror(0);
+          tr=reg_parm(&reg_handle,(*t->exact->sl)[i].styp,0,t);
+          if(!(*t->exact->sl)[i].reg) (*t->exact->sl)[i].reg=tr;
+        }
+#endif
+        if((*t->exact->sl)[i].reg>0) sc|=REGPARM;
+        if((*t->exact->sl)[i].reg<0) sc|=(REGPARM|DBLPUSH);
+        tmp=add_var((*t->exact->sl)[i].identifier,clone_typ((*t->exact->sl)[i].styp),sc,0);
+        tmp->reg=(*t->exact->sl)[i].reg;
+        tmp->flags|=DEFINED;
+        tmp->dfilename=filename;
+        tmp->dline=line;
+        if(oldstyle){
+#ifdef HAVE_MISRA
+/* removed */
+#endif
+          freetyp((*t->exact->sl)[i].styp);
+          (*t->exact->sl)[i].styp=0; /*  Prototype entfernen */
+        }
+      }
+    }
+    if(oldstyle) t->exact->count=0; /*  Prototype entfernen */
+    /*        local_offset[1]=l2zm(0L);*/
+    return_label=++label;
+    function_calls=0;float_used=0;has_return=0;goto_used=0;vlas=0;
+    did_return_label=0;
+    for(i=1;i<=MAXR;i++) simple_scratch[i]=0;
+    if(v->storage_class==EXTERN&&(v->flags&INLINEFUNC))
+      disallow_statics=1;
+#ifdef HAVE_ECPP
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+#ifdef HAVE_MISRA
+/* removed */
+/* removed */
+#endif
+
+    if(c99){
+      /* c99 predefined __func__ */
+      type *ft=new_typ();
+      Var *fnc;
+
+      /* create type */
+      ft->flags=ARRAY;
+      ft->size=l2zm((long)strlen(cur_func)+1);
+      ft->next=new_typ();
+      ft->next->flags=CONST|CHAR;
+
+      /* use string_expression() to create const_list */
+      fnc=add_var("__func__",ft,STATIC,cl_from_string(cur_func,cur_func+strlen(cur_func)));
+      fnc->flags|=DEFINED;
+    }
+
+    /* Generate intermediate code for function */
+    compound_statement();
+
+#ifdef HAVE_MISRA
+/* removed */
+#endif
+#ifdef HAVE_ECPP
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+    cur_funcv=0;
+    disallow_statics=0;
+    if(block_vla[nesting]) clearvl();
+    if((v->vtyp->next->flags&NQ)!=VOID&&!has_return){
+      if(strcmp(v->identifier,"main")) error(173,v->identifier);
+      else error(174,v->identifier);
+    }
+#if 0
+    {int i;
+    for(i=1;i<=MAXR;i++) if(regs[i]!=regsa[i]) {printf("Register %s:\n",regnames[i]);ierror(0);}
+    }
+#endif
+    if(!did_return_label){
+      clear_main_ret();
+      gen_label(return_label);
+    }
+    /* backpatch code for jumps out of vla-scope if necessary */
+    if(vlas)
+      vla_jump_fix();
+    if(cross_module){
+      if(!v->fi) v->fi=new_fi();
+      v->fi->statics=first_var[0];
+    }else if(first_ic&&errors==0){
+      if((c_flags[2]&USEDFLAG)&&ic1){fprintf(ic1,"function %s\n",v->identifier); pric(ic1,first_ic);}
+      vl1=first_var[0];
+      vl2=first_var[1];
+      vl3=merk_varf;
+      optimize(optflags,v);
+      if((c_flags[3]&USEDFLAG)&&ic2){fprintf(ic2,"function %s\n",v->identifier); pric(ic2,first_ic);}
+      if(out&&!only_inline&&!(c_flags[5]&USEDFLAG)){
+        memset(regs_modified,0,RSIZE);
+        gen_code(out,first_ic,v,max_offset);
+        static_stack_check(v);
+        v->flags|=GENERATED;
+#ifdef HAVE_REGS_MODIFIED
+        if(!v->fi) v->fi=new_fi();
+        if(v->fi->flags&ALL_REGS)
+        {
+          int i;
+          for(i=1;i<=MAXR;i++){
+            if(reg_pair(i,&rp)){
+              if(BTST(regs_modified,i)){
+                BSET(regs_modified,rp.r1);
+                BSET(regs_modified,rp.r2);
+              }else{
+                if(BTST(regs_modified,rp.r1)||BTST(regs_modified,rp.r2))
+                  BSET(regs_modified,i);
+              }
+            }
+          }
+          memcpy(v->fi->regs_modified,regs_modified,RSIZE);
+          v->fi->flags|=ALL_REGS;
+        }
+#endif
+      }
+      /*if(DEBUG&8192){fprintf(ic2,"function %s, after gen_code\n",v->identifier); pric(ic2,first_ic);}*/
+      free_IC(first_ic);
+      first_ic=last_ic=0;
+    }
+    if(cross_module){
+      if(!v->fi) v->fi=new_fi();
+      v->fi->first_ic=first_ic;
+      v->fi->last_ic=last_ic;
+      first_ic=last_ic=0;
+    }
+    if(v->fi&&v->fi->first_ic){
+      Var *vp;
+      if(DEBUG&1) printf("leave block %d (inline-version)\n",nesting);
+      if(block_vla[nesting]) clearvl();
+      if(nesting!=1) ierror(0);
+      if(merk_varl) merk_varl->next=first_var[nesting]; else merk_varf=first_var[nesting];
+      if(last_var[nesting]) merk_varl=last_var[nesting];
+      if(merk_sil) merk_sil->next=first_si[nesting]; else merk_sif=first_si[nesting];
+      if(last_si[nesting]) merk_sil=last_si[nesting];
+      if(merk_sdl) merk_sdl->next=first_sd[nesting]; else merk_sdf=first_sd[nesting];
+      if(last_sd[nesting]) merk_sdl=last_sd[nesting];
+      if(merk_ilistl) merk_ilistl->next=first_ilist[nesting]; else merk_ilistf=first_ilist[nesting];
+      if(last_ilist[nesting]) merk_ilistl=last_ilist[nesting];
+      
+      if(merk_varf&&!only_inline&&!cross_module) gen_vars(merk_varf);
+      if(first_llist) free_llist(first_llist);
+      first_llist=0;
+      if(first_clist) free_clist(first_clist);
+      first_clist=0;
+      if(merk_sif) free_si(merk_sif);
+      /*  struct-declarations erst ganz am Schluss loeschen. Um zu vermeiden,     */
+      /*  dass struct-declarations in Prototypen frei werden und dann eine        */
+      /*  spaetere struct, dieselbe Adresse bekommt und dadurch gleich wird.      */
+      /*  Nicht sehr schoen - wenn moeglich noch mal aendern.                     */
+      /*            if(merk_sdf) free_sd(merk_sdf);*/
+      /*  hier noch was ueberlegen    */
+      /*            if(merk_ilistf) free_ilist(merk_ilistf);*/
+      nesting--;
+      v->fi->vars=merk_varf;
+      /*            v->fi->vars=first_var[1];*/
+      /*  keine echten Parameter=>keine negativen Offsets */
+      /*            vp=first_var[1];*/
+      if(!cross_module){
+        vp=merk_varf;
+        while(vp){
+          if(vp->storage_class==AUTO||vp->storage_class==REGISTER){
+            /*if(DEBUG&1024) printf("handling variable %s(%ld)/%p\n",vp->identifier,zm2l(vp->offset),(void*)vp);*/
+            if(!zmleq(l2zm(0L),vp->offset)){
+              vp->offset=l2zm(0L);
+              if(DEBUG&1024) printf("converted parameter <%s>(%ld) for inlining\n",vp->identifier,(long)zm2l(vp->offset));
+            }else vp->offset=l2zm(4L);  /*  Dummy, da recalc_offsets?   */
+          }
+          vp=vp->next;
+        }
+      }
+    }else{
+      leave_block();
+    }
+    if(only_inline==2) only_inline=0;
+    cur_func="oops, I forgot it";
+  }else{
+    if(makeint) error(125);
+    if(ctok->type==SEMIC) next_token(); else error(54);
+    if(ISFUNC(t->flags)&&t->exact){
+      struct_declaration *sd=t->exact;int i,f;
+      for(f=0,i=0;i<sd->count;i++)
+        if(!(*sd->sl)[i].styp){error(126);f=1;}
+      if(f){
+        for(i=0;i<sd->count;i++) if((*sd->sl)[i].styp) freetyp((*sd->sl)[i].styp);
+        sd->count=0;
+      }
+    }
+  }
+  if(old) freetyp(old);
+}
+int compatible_types(type *a,type *b,int qual)
+/*  Vergleicht, ob Typ beider Typen gleich ist, const/volatile      */
+/*  werden laut ANSI nicht beruecksichtigt.                         */
+{
+  struct_declaration *sd;
+  int af=a->flags&qual,bf=b->flags&qual;
+  if(af!=bf) return(0);
+  af&=NQ;bf&=NQ;
+  if(ISFUNC(af)){
+    if(a->exact->count&&!compare_sd(a->exact,b->exact)) return(0);
+  }
+  if(ISSTRUCT(af)||ISUNION(af)){
+    if(cross_module&&a->exact->tunit!=b->exact->tunit) return 1;
+    if(a->exact!=b->exact) return(0);
+  }
+  if(ISARRAY(af)){
+    if(!zmeqto(a->size,l2zm(0L))&&!zmeqto(b->size,l2zm(0L))&&!zmeqto(a->size,b->size)) return(0);
+  }
+  if(a->next==0&&b->next!=0) return(0);
+  if(a->next!=0&&b->next==0) return(0);
+  if(a->next==0&&b->next==0) return(1);
+  if(qual!=NQ) qual=(NU|CONST|VOLATILE);
+  return(compatible_types(a->next,b->next,qual));
+}
+int compare_sd(struct_declaration *a,struct_declaration *b)
+/*  Vergleicht, ob zwei struct_declarations identisch sind          */
+/*  Wird nur nur fuer Prototypen benutzt, leere Liste immer gleich. */
+{
+  int i;
+  if(!a->count||!b->count) return(1);
+  if(a->count!=b->count) return(0);
+  for(i=0;i<a->count;i++){
+    if((*a->sl)[i].styp&&(*b->sl)[i].styp&&!compatible_types((*a->sl)[i].styp,(*b->sl)[i].styp,NU)) return(0);
+    if((*a->sl)[i].reg!=(*b->sl)[i].reg) {error(368);return 0;}
+#ifdef HAVE_MISRA
+/* removed */
+/* removed */
+#endif
+  }
+  return(1);
+}
+void free_clist(const_list *p)
+/*  Gibt clist frei.                                        */
+{
+  const_list *merk;
+  return;
+  while(p){
+    merk=p->next;
+    if(p->other) free_clist(p->other);
+    if(p->tree) free_expression(p->tree);
+    free(p);
+    p=merk;
+  }
+}
+void gen_clist(FILE *,type *,const_list *);
+
+void gen_vars(Var *v)
+/*  Generiert Variablen.                                    */
+{
+  int mode,al,first_pass=1;Var *p;
+  if(errors!=0||(c_flags[5]&USEDFLAG)) return;
+  if(optsize)
+    al=zm2l(maxalign);
+  else
+    al=0;
+  for(;al>=0;al--){
+    for(mode=0;mode<3;mode++){
+      int i,flag;
+      for(p=v;p;p=p->next){
+	if(p->flags&NEEDS) continue;
+        if(optsize&&zm2l(falign(p->vtyp))!=al)
+          continue;
+        if(cross_module&&!(p->flags&REFERENCED)) continue;
+        if(DEBUG&2) printf("gen_var(): %s\n",p->identifier);
+        if(p->storage_class==STATIC||p->storage_class==EXTERN){
+          if(!(p->flags&GENERATED)){
+            if(p->storage_class==EXTERN&&!(p->flags&(USEDASSOURCE|USEDASDEST))&&!(p->flags&(TENTATIVE|DEFINED))) continue;
+	    if(p->storage_class==STATIC&&p->nesting>0&&!(p->flags&(USEDASSOURCE|USEDASDEST))) continue;
+            /*  erst konstante initialisierte Daten */
+            if(mode==0){
+              if(!p->clist) continue;
+              if(!(p->vtyp->flags&(CONST|STRINGCONST))){
+                type *t=p->vtyp;int f=0;
+                do{
+                  if(t->flags&(CONST|STRINGCONST)) break;
+                  if(!ISARRAY(t->flags)){f=1;break;}
+                  t=t->next;
+                }while(1);
+                if(f) continue;
+              }
+            }
+            /*  dann initiolisierte */
+            if(mode==1&&!p->clist) continue;
+            /*  und dann der Rest   */
+         
+	    if(mode==2&&p->clist) continue;
+   
+            if(!(p->flags&(TENTATIVE|DEFINED))){
+              if(!((p->vtyp->flags&NQ)==FUNKT)||!p->fi||!p->fi->inline_asm){
+		if(mask_opt){
+		  if((p->flags&PRINTFLIKE)&&!strstr(p->identifier,".")) needs("vfprintf");
+		  if((p->flags&SCANFLIKE)&&!strstr(p->identifier,".")) needs("vfscanf");
+		}
+                gen_var_head(out,p);
+	      }
+              if(p->storage_class==STATIC&&(!p->fi||!p->fi->inline_asm)) error(127,p->identifier);
+              continue;
+            }else{
+              /*gen_align(out,falign(p->vtyp));*/
+            }
+            if(!((p->vtyp->flags&NQ)==FUNKT)||!p->fi||!p->fi->inline_asm){
+	      if(mask_opt){
+		if((p->flags&PRINTFLIKE)&&!strstr(p->identifier,".")) needs("vfprintf");
+		if((p->flags&SCANFLIKE)&&!strstr(p->identifier,".")) needs("vfscanf");
+	      }
+              gen_var_head(out,p);
+	    }
+            if(!p->clist){
+              if(type_uncomplete(p->vtyp)) error(202,p->identifier);
+              gen_ds(out,szof(p->vtyp),p->vtyp);
+            }else{
+              gen_clist(out,p->vtyp,p->clist);
+            }
+            p->flags|=GENERATED;
+          }else if(p->flags&INLINEEXT){
+            /* a function was declared extern inline and defined;
+               we have to create external linkage */
+            int m=p->flags;
+            /* pretend, it was only declared, but not defined and remove
+               INLINEEXT */
+            p->flags&=~(DEFINED|INLINEEXT);
+            gen_var_head(out,p);
+            p->flags|=DEFINED;
+          }
+        }
+      }
+      first_pass=0;
+    }
+  }
+  if(mask_opt){
+    for(p=v;p;p=p->next)
+      if(p->flags&NEEDS) gen_var_head(out,p);
+  }
+}
+
+/* creates code that dynamically initializes a variable */
+void dynamic_init(Var *v,type *t,const_list *cl,zmax of,int noconst)
+{
+  int f=t->flags;
+  if(ISARRAY(f)){
+    zmax i;
+    for(i=l2zm(0L);!zmleq(t->size,i);i=zmadd(i,l2zm(1L))){
+      if(cl&&zmeqto(cl->idx,i)){
+	dynamic_init(v,t->next,cl->other,of,noconst);
+	cl=cl->next;
+      }else{
+	dynamic_init(v,t->next,0,of,noconst);
+      }
+      of=zmadd(of,szof(t->next));
+    }
+  }else if(ISUNION(f)&&(!cl||!cl->tree)){
+    dynamic_init(v,(*t->exact->sl)[cl?zm2l(cl->idx):0].styp,cl?cl->other:0,of,noconst);
+  }else if(ISSTRUCT(f)&&(!cl||!cl->tree)){
+    zmax al;int fl;type *st;
+    int bfo,i;
+    for(i=0;i<t->exact->count&&cl;i++){
+      if(!cl->other){
+	if(errors==0)
+	  ierror(0);
+	return;
+      }
+      st=(*t->exact->sl)[i].styp;
+      al=(*t->exact->sl)[i].align;
+      if(!(*t->exact->sl)[i].identifier) ierror(0);
+      bfo=(*t->exact->sl)[i].bfoffset;
+      if(!zmeqto(zmmod(of,al),l2zm(0L))){
+        of=zmadd(of,zmsub(al,zmmod(of,al)));
+      }
+      if(bfo>=0){
+	int bfs=(*t->exact->sl)[i].bfsize;
+	static obj dest = {0};
+	  
+	dest.flags=VAR;
+	dest.v=v;
+	dest.val.vmax=of;
+
+	if(bfo==0){
+	  /* first clear entire bitfield */
+	  IC *new=new_IC();
+	  new->code=ASSIGN;
+	  new->z=dest;
+	  new->typf=st->flags;
+	  new->q2.val.vmax=sizetab[st->flags&NQ];
+	  new->q1.flags=KONST;
+	  new->q1.val.vmax=l2zm(0L);
+	  eval_const(&new->q1.val,MAXINT);
+	  insert_const(&new->q1.val,st->flags&NU);
+	  add_IC(new);
+	}
+
+	/* bitfield */
+	if(!zmeqto(cl->idx,l2zm(i))||!cl->other){
+	  /* nothing to do, initialized before */
+	}else if(cl->other->tree){
+	  obj dummy;
+	  gen_IC(cl->other->tree,0,0);
+	  convert(cl->other->tree,st->flags);
+	  insert_bitfield(&dest,&cl->other->tree->o,&cl->other->tree->o,bfs,bfo,st->flags,1);
+	  cl=cl->next;
+	}else{
+	  static obj val = {0};
+	  val.flags=KONST;
+	  val.val=cl->other->val;
+	  insert_bitfield(&dest,&val,&val,bfs,bfo,st->flags,1);
+	  cl=cl->next;
+	}
+	if(i+1>=t->exact->count||(*t->exact->sl)[i+1].bfoffset<=0||!cl){
+	  of=zmadd(of,szof(st));
+	}
+      }else{
+	if(zmeqto(l2zm((long)i),cl->idx)){
+	  dynamic_init(v,st,cl->other,of,noconst);
+	  cl=cl->next;
+	}else
+	  dynamic_init(v,st,0,of,noconst);
+        of=zmadd(of,szof(st));
+      }
+    }
+    for(;i<t->exact->count;i++){
+      st=(*t->exact->sl)[i].styp;
+      al=(*t->exact->sl)[i].align;
+      bfo=(*t->exact->sl)[i].bfoffset;
+      if(bfo>0) continue;
+      if(!zmeqto(zmmod(of,al),l2zm(0L))){
+        of=zmadd(of,zmsub(al,zmmod(of,al)));
+      }
+      dynamic_init(v,st,0,of,noconst);
+      of=zmadd(of,szof(st));
+    }
+  }else{
+    IC *new;
+    if(noconst&&(!cl||!cl->tree))
+      return;
+    new=new_IC();
+    new->code=ASSIGN;
+    new->z.flags=VAR;
+    new->z.v=v;
+    new->z.val.vmax=of;
+    new->typf=t->flags;
+    new->q2.val.vmax=szof(t);
+    if(!cl){
+      new->q1.flags=KONST;
+      gval.vmax=l2zm(0L);
+      eval_const(&gval,MAXINT);
+      insert_const(&new->q1.val,t->flags&NU);
+    }else if(cl->tree){
+      gen_IC(cl->tree,0,0);
+      if(ISSCALAR(t->flags))
+	convert(cl->tree,t->flags);
+      new->q1=cl->tree->o;
+    }else{
+      new->q1.flags=KONST;
+      new->q1.val=cl->val;
+    }
+    add_IC(new);
+  }
+}
+
+
+void gen_clist(FILE *f,type *t,const_list *cl)
+/*  Generiert dc fuer const_list.                           */
+{
+  int i,bfo,bfs;zmax sz;zumax bfval=ul2zum(0UL);
+
+#if 0
+  for(i=0;i<(int)szof(t);i++){
+    zuchar c;int s;
+    s=get_clist_byte(t,cl,i,&c);
+    printf("%03d: 0x%02x (%d)\n",i,(int)c,s);
+  }
+#endif
+
+
+  if(ISARRAY(t->flags)){
+    for(sz=l2zm(0L);!zmleq(t->size,sz)&&cl;cl=cl->next){
+      if(!cl->other){ierror(0);return;}
+      if(!zmeqto(sz,cl->idx))
+	gen_ds(f,zmmult(zmsub(cl->idx,sz),szof(t->next)),t->next);
+
+      gen_clist(f,t->next,cl->other);
+      sz=zmadd(cl->idx,l2zm(1L));
+    }
+    if(!zmleq(t->size,sz)) gen_ds(f,zmmult(zmsub(t->size,sz),szof(t->next)),t->next);
+    return;
+  }
+  if(ISUNION(t->flags)){
+    int i=zm2l(cl->idx);
+    if(cl&&cl->tree){
+      /* union initialized by another union */
+      gen_ds(f,szof(t),t);
+    }else{
+      gen_clist(f,(*t->exact->sl)[i].styp,cl->other);
+      sz=zmsub(szof(t),szof((*t->exact->sl)[i].styp));
+      if(!zmeqto(sz,l2zm(0L))) gen_ds(f,sz,0);
+    }
+    return;
+  }
+  if(ISSTRUCT(t->flags)){
+    zmax al;int fl;type *st;
+    sz=l2zm(0L);
+    if(cl&&cl->tree){
+      /* initialized by another */
+      gen_ds(f,szof(t),t);
+      sz=zmadd(sz,szof(t));
+    }else{
+      for(i=0;i<t->exact->count&&cl;i++){
+	if(!cl->other){ierror(0);return;}
+	st=(*t->exact->sl)[i].styp;
+	al=(*t->exact->sl)[i].align;
+	if(!(*t->exact->sl)[i].identifier) ierror(0);
+	bfo=(*t->exact->sl)[i].bfoffset;
+	if(!zmeqto(zmmod(sz,al),l2zm(0L))){
+	  gen_ds(f,zmsub(al,zmmod(sz,al)),0);
+	  sz=zmadd(sz,zmsub(al,zmmod(sz,al)));
+	}
+	if(bfo>=0){
+	  /* bitfield */
+	  if((*t->exact->sl)[i].identifier[0]){
+	    bfs=(*t->exact->sl)[i].bfsize;
+	    if(zmeqto(l2zm((long)i),cl->idx)){
+	      eval_const(&cl->other->val,st->flags);
+	      cl=cl->next;
+	    }else{
+	      vumax=ul2zum(0UL);
+	    }
+	    vumax=zumand(vumax,zumsub(zumlshift(ul2zum(1UL),ul2zum((unsigned long)bfs)),ul2zum(1UL)));
+	    bfval=zumor(bfval,zumlshift(vumax,ul2zum((unsigned long)bflayout(bfo,bfs,st->flags))));
+	  }          
+	  if(i+1>=t->exact->count||(*t->exact->sl)[i+1].bfoffset<=0||!cl){
+	    /* last bitfield in integer */
+	    const_list bfcl;
+	    gval.vumax=bfval;
+	    eval_const(&gval,UNSIGNED|MAXINT);
+	    insert_const(&bfcl.val,st->flags&NU);
+	    bfcl.tree=0;
+	    gen_dc(f,st->flags&NU,&bfcl);
+	    bfval=ul2zum(0L);
+	    sz=zmadd(sz,szof(st));
+	  }
+	}else{
+	  if(zmeqto(l2zm((long)i),cl->idx)){
+	    gen_clist(f,st,cl->other);
+	    cl=cl->next;
+	  }else
+	    gen_ds(f,szof(st),st);
+	  sz=zmadd(sz,szof(st));
+	}
+      }
+      for(;i<t->exact->count;i++){
+	st=(*t->exact->sl)[i].styp;
+	al=(*t->exact->sl)[i].align;
+	bfo=(*t->exact->sl)[i].bfoffset;
+	if(bfo>0) continue;
+	if(!zmeqto(zmmod(sz,al),l2zm(0L))){
+	  gen_ds(f,zmsub(al,zmmod(sz,al)),0);
+	  sz=zmadd(sz,zmsub(al,zmmod(sz,al)));
+	}
+	gen_ds(f,szof((*t->exact->sl)[i].styp),(*t->exact->sl)[i].styp);
+	sz=zmadd(sz,szof(st));
+      }
+    }
+    al=falign(t);
+    if(!zmeqto(zmmod(sz,al),l2zm(0L)))
+      gen_ds(f,zmsub(al,zmmod(sz,al)),0);
+    return;
+  }
+
+  if(cl->tree) cl->tree->o.am=0;
+
+  if(zmeqto(cl->idx,l2zm(-1L)))
+    gen_ds(f,szof(t),t);
+  else
+    gen_dc(f,t->flags&NU,cl);
+}
+
+/* finds the correct place in a const list to insert new initializer */
+const_list *insert_cl(const_list *old,zmax idx)
+{
+  const_list *p,*cl=0;
+  if(old&&zmleq(old->idx,idx)){
+    p=old;
+    do{
+      if(zmeqto(p->idx,idx)){
+	/* found existing entry */
+	cl=p;
+	break;
+      }
+      if(!p->next||!zmleq(p->next->idx,idx))
+	break;
+      p=p->next;
+    }while(p);
+  }else
+    p=0;
+  /* we need a new entry */
+  if(!cl){
+    cl=mymalloc(CLS);
+    cl->tree=0;
+    cl->other=0;
+    cl->idx=idx;
+    if(p){
+      cl->next=p->next;
+      p->next=cl;
+    }else
+      cl->next=old;
+  }
+  return cl;
+}
+
+const_list *designator(type *t,const_list *cl)
+{
+  int f=t->flags&NQ;
+  np tree;
+  if(!c99) return 0;
+  if(ISARRAY(f)&&ctok->type==LBRK){
+    next_token();
+    killsp();
+    tree=expression();
+    if(ctok->type!=RBRK)
+      error(62);
+    else
+      {next_token();killsp();}
+    if(!type_expression(tree,0)){
+      /*                    error("incorrect constant expression");*/
+    }else{
+      if(tree->sidefx) error(60);
+      if(tree->flags!=CEXPR||!ISINT(tree->ntyp->flags)){
+	error(19);
+      }else{
+	/* check index for valid range */
+	eval_constn(tree);
+	if(!zmleq(l2zm(0L),vmax)) {error(354);vmax=l2zm(0L);}
+	if(!zmeqto(t->size,l2zm(0L))&&zmleq(t->size,vmax)) {error(354);vmax=l2zm(0L);}
+
+	cl=insert_cl(cl,vmax);
+
+	return cl;
+      }
+    }
+  }else if((ISSTRUCT(f)||ISUNION(f))&&ctok->type==DOT){
+    next_token();
+    killsp();
+    if(ctok->type!=NAME){
+      error(53);
+    }else{
+      int i,n=-1;
+      for(i=0;i<t->exact->count;i++)
+	if(!strcmp((*t->exact->sl)[i].identifier,ctok->name)) n=i;
+      if(n<0){
+	error(23,ctok->name);
+	return 0;
+      }
+      next_token();
+      killsp();
+
+      if(!ISUNION(f)||!cl)
+	cl=insert_cl(cl,l2zm((long)n));
+
+      return cl;
+    }
+  }
+  return 0;
+}
+
+/* declare a builtin function with up to two scalar arguments */
+Var *declare_builtin(char *name,int ztyp,int q1typ,int q1reg,int q2typ,int q2reg,int nosidefx,char *asm)
+{
+  struct_declaration *sd;
+  type *t;
+  Var *v;
+  int args;
+  if(!(v=find_ext_var(name))){
+    sd=mymalloc(sizeof(*sd));
+    if(q1typ==0) args=1;
+    else if(q2typ!=0) args=3;
+    else args=2;
+    sd->sl=mymalloc(args*sizeof(struct_list));
+    memset(sd->sl,0,args*sizeof(struct_list));
+    sd->count=args;
+    if(q1typ){
+      (*sd->sl)[0].styp=new_typ();
+      (*sd->sl)[0].styp->flags=q1typ;
+      (*sd->sl)[0].reg=q1reg;
+    }
+    if(q2typ){
+      (*sd->sl)[1].styp=new_typ();
+      (*sd->sl)[1].styp->flags=q2typ;
+      (*sd->sl)[1].reg=q2reg;
+    }
+    (*sd->sl)[args-1].styp=new_typ();
+    (*sd->sl)[args-1].styp->flags=VOID;
+    (*sd->sl)[args-1].reg=0;
+    t=new_typ();
+    t->flags=FUNKT;
+    t->exact=add_sd(sd,FUNKT);
+    t->next=new_typ();
+    t->next->flags=ztyp;
+    v=add_var(name,t,EXTERN,0);
+    v->flags|=BUILTIN;
+    if(asm||nosidefx){
+      v->fi=new_fi();
+      if(asm) v->fi->inline_asm=asm;
+      if(nosidefx){
+	v->fi->call_cnt=v->fi->use_cnt=v->fi->change_cnt=0;
+	v->fi->flags=ALL_CALLS|ALL_USES|ALL_MODS|ALWAYS_RETURNS|NOSIDEFX;
+      }
+    }
+  }
+  return v;
+}
+
+
+const_list *initialization(type *t,int noconst,int level,int desi,struct_declaration *fstruct,const_list *first)
+/*  Traegt eine Initialisierung in eine const_list ein.         */
+{
+  const_list *cl,**prev;
+  np tree,tree2;
+  int bracket,desi_follows=0;
+  zmax i;
+  token mtok;
+  
+  int f=t->flags&NQ;
+  if(ISFUNC(f)){error(42);return(0);}
+  if(ctok->type==LBRA){next_token();killsp();bracket=1;} else bracket=0;
+  if(ISARRAY(f)){
+#ifdef HAVE_MISRA
+/* removed */
+#endif
+    if(t->dsize){
+      error(358);
+    }else if(zmeqto(t->size,l2zm(0L))&&level!=0){
+      error(359);
+    }else if(ctok->type==T_STRING&&t->next&&(t->next->flags&NQ)==CHAR){
+      killsp();
+      tree=string_expression();
+      first=tree->cl;
+      free_expression(tree);
+    }else{
+      const_list *last=first;
+      if(level==0&&!bracket) error(157);
+      for(i=l2zm(0L);desi_follows||((zmeqto(t->size,l2zm(0L))||!zmleq(t->size,i)||ctok->type==LBRK)&&ctok->type!=RBRA);i=zmadd(i,l2zm(1L))){
+        if(!zmleq(i,0)){
+          if(ctok->type==COMMA){next_token();killsp();} else break;
+          if(ctok->type==RBRA) break;
+        }
+	/* check for first designated initializer */
+	cl=designator(t,first);
+	if(!cl){
+	  /* no designator */
+	  cl=insert_cl(last,i);
+	  cl->other=initialization(t->next,c99?noconst:0,level+1,0,fstruct,cl->other);
+	  if(cl->other&&zmeqto(cl->other->idx,l2zm(-2L))){
+	    first=cl->other;
+	    first->other=0;
+	    break;
+	  }
+	}else{
+	  /* designator: store current object and handle remaining designators */
+	  i=cl->idx;
+	  if(ctok->type!=ASGN){
+	    if(ctok->type!=LBRK&&ctok->type!=DOT)
+	      error(355);
+	  }else{
+	    cl->other=0;
+	    next_token();killsp();
+	  }
+	  cl->other=initialization(t->next,c99?noconst:0,level+1,1,fstruct,cl->other);
+	}
+	if(cl->next==first) first=cl;
+	last=cl;
+        killsp();
+	if(desi&&!bracket)
+	  break;
+	desi_follows=0;
+	if(ctok->type==COMMA){
+	  copy_token(&mtok,ctok);
+	  next_token();killsp();
+	  if(ctok->type==LBRK)
+	    desi_follows=1;
+	  push_token(&mtok);
+	}
+      }
+
+      if(bracket&&zmeqto(i,l2zm(0L))) error(360);
+
+#ifdef HAVE_MISRA
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+    }
+  }else if(ISSTRUCT(f)&&(bracket||!noconst||c99)){
+    if(t->exact->count<=0)
+      {error(43);return(0);}
+#ifdef HAVE_ECPP
+/* removed */
+#endif
+    prev=0;
+    if(level==0&&!bracket&&!c99) error(157);
+    for(i=l2zm(0L);desi_follows||(!zmleq(t->exact->count,i)&&ctok->type!=RBRA);i=zmadd(i,l2zm(1L))){
+      if(!desi_follows&&(*t->exact->sl)[zm2l(i)].identifier[0]==0) continue; /* unnamed bitfield */
+      if(!zmleq(i,0)){
+        if(ctok->type==COMMA){next_token();killsp();} else break;
+        if(ctok->type==RBRA) break;
+      }
+      cl=designator(t,first);
+
+      if(!cl){
+	cl=insert_cl(first,l2zm((long)i));
+	cl->other=initialization((*t->exact->sl)[zm2l(i)].styp,c99?noconst:0,level+1,0,!fstruct&&!bracket&&zmeqto(i,l2zm(0L))?t->exact:fstruct,cl->other);
+	if(cl->other&&zmeqto(cl->other->idx,l2zm(-2L))){
+	  if(fstruct){
+	    first=cl->other;
+	    first->other=0;
+	  }else{
+	    *cl=*cl->other;
+	    cl->idx=l2zm(-1L);
+	    cl->other=0;
+	    first=cl;
+	  }
+	  break;
+	}
+      }else{
+	i=zm2l(cl->idx);
+	if(ctok->type!=ASGN){
+	  if(ctok->type!=LBRK&&ctok->type!=DOT)
+	    error(355);
+	}else{
+	  next_token();killsp();
+	  cl->other=0;
+	}
+	cl->other=initialization((*t->exact->sl)[zm2l(i)].styp,c99?noconst:0,level+1,1,fstruct,cl->other);
+      }
+      if(cl->next==first) first=cl;
+      if(desi&&!bracket)
+	break;
+      desi_follows=0;
+      if(ctok->type==COMMA){
+	copy_token(&mtok,ctok);
+	next_token();killsp();
+	if(ctok->type==DOT)
+	  desi_follows=1;
+	push_token(&mtok);
+      }
+    }
+
+    if(bracket&&zmeqto(i,l2zm(0L))) error(360);
+
+#ifdef HAVE_MISRA
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
+
+  }else if(ISUNION(f)&&(c99||bracket||!noconst)){
+    if(t->exact->count<=0)
+      {error(44);return(0);}
+
+    if(level==0&&!bracket&&!c99) error(157);
+    desi_follows=1;
+    while(desi_follows){
+      cl=designator(t,first);
+
+      if(!cl){
+	cl=insert_cl(first,l2zm((long)0));
+	cl->other=initialization((*t->exact->sl)[0].styp,c99?noconst:0,level+1,0,!fstruct&&!bracket?t->exact:fstruct,cl->other);
+	if(cl->other&&zmeqto(cl->other->idx,l2zm(-2L))){
+	  if(fstruct){
+	    first=cl->other;
+	    first->other=0;
+	  }else{
+	    *cl=*cl->other;
+	    cl->other=0;
+	    cl->idx=l2zm(-1L);
+	    first=cl;
+	  }
+	  break;
+	}
+      }else{
+	i=zm2l(cl->idx);
+	if(ctok->type!=ASGN){
+	  if(ctok->type!=LBRK&&ctok->type!=DOT)
+	    error(355);
+	}else{
+	  next_token();killsp();
+	  cl->other=0;
+	}
+	cl->other=initialization((*t->exact->sl)[zm2l(i)].styp,c99?noconst:0,level+1,1,fstruct,cl->other);
+      }
+      first=cl;
+      if(desi&&!bracket)
+	break;
+      desi_follows=0;
+      if(ctok->type==COMMA){
+	copy_token(&mtok,ctok);
+	next_token();killsp();
+	if(ctok->type==DOT)
+	  desi_follows=1;
+	else
+	  push_token(&mtok);
+      }
+    }
+  }else{
+    int oldconst=const_expr;
+    tree2=tree=assignment_expression();
+
+    if(!tree){error(45);return(0);}
+    if(!noconst) const_expr=1;
+    if(!type_expression(tree,t)){free_expression(tree); const_expr=oldconst;return 0;}
+    const_expr=oldconst;
+
+    tree=makepointer(tree);
+
+    /* check for complete assignment in dynamic initialization */
+    if(noconst&&(ISSTRUCT(tree->ntyp->flags)||ISUNION(tree->ntyp->flags))&&fstruct==tree->ntyp->exact){
+      first=mymalloc(CLS);
+      first->tree=tree;
+      first->next=first->other=0;
+      first->idx=l2zm(-2L);
+      return first;
+    }
+
+    if(!test_assignment(t,tree)){free_expression(tree); return 0;}
+    if(!noconst){
+      /*  nur Konstanten erlaubt (bei Arrays/Strukturen etc. oder static) */
+      if(tree->flags!=CEXPR){
+        /*while(tree->flags==CAST) tree=tree->left;*/
+        if(!tree->sidefx/*tree->flags==ADDRESS||tree->flags==ADDRESSS||tree->flags==ADDRESSA*/){
+          const_expr=1;
+          gen_IC(tree,0,0);
+          const_expr=oldconst;
+          if(!(tree->o.flags&VARADR)){
+            /*  hier fehlen noch viele Pruefungen   */
+            free_expression(tree);error(46);
+            return(0);
+          }
+          tree->o.v->flags|=USEDASADR;
+          first=mymalloc(CLS);
+          first->next=first->other=0;
+          first->tree=tree;
+	  first->idx=l2zm(0L);
+          killsp();
+        }else{
+          free_expression(tree);error(46);
+          return(0);
+        }
+      }else{
+        first=mymalloc(CLS);
+	first->idx=l2zm(0L);
+        first->next=first->other=0;
+        first->tree=0;
+        eval_constn(tree);
+        tree->ntyp->flags=t->flags;
+        insert_constn(tree);
+        first->val=tree->val;
+        free_expression(tree2);
+        killsp();
+      }
+    }else{
+      /*  auch anderes erlaubt    */
+      first=mymalloc(CLS);
+      first->next=first->other=0;
+      first->tree=tree;
+      killsp();
+      if(!tree->sidefx){
+	if(tree->flags==CEXPR){
+	  eval_constn(tree);
+	  tree->ntyp->flags=t->flags;
+	  insert_constn(tree);
+	  first->val=tree->val;
+	  first->tree=0;
+	  first->idx=l2zm(0L);
+	  init_const_sz=zmadd(init_const_sz,szof(tree->ntyp));
+	  init_const_cnt++;
+	  free_expression(tree2);
+	}else{
+	  first->idx=l2zm(-1L);
+	  init_dyn_sz=zmadd(init_dyn_sz,szof(tree->ntyp));
+	  init_dyn_cnt++;
+	}
+      }else{
+	first->idx=l2zm(-1L);
+	init_dyn_sz=zmadd(init_dyn_sz,szof(tree->ntyp));
+	init_dyn_cnt++;
+      }
+    }
+  }
+  if(bracket){
+    if(ctok->type==COMMA){next_token();killsp();}
+    if(ctok->type==RBRA){next_token();killsp();} else error(128);
+  }
+  return(first);
+}
+#ifdef HAVE_ECPP
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+/* removed */
+#endif
