function printtoctor( aa )
{
    ctor = ctor aa
}
function printtodtor( aa )
{
    dtor = dtor aa
}
function printtofunc( aa )
{
    fun = fun aa
}
function printp( a )
{
    #printf a >>  "PRIVATE"
    private = private a
}
function printg( a )
{
    printf a >> FILENAME "Impl.h"
}
function printh( a )
{
    printf a >> FILENAME "Impl.cc"
}
function doFuncCC( a, class )
{
    gsub("attribute", "", $0)
    nr = split($0, b, " ")
    # do method
    i = 1
    while ( i  < nr && b[i + 1] != "(" )
    {
        var = b[i++]
        if(match(var, "SVG") != 0 )
            printtofunc( var "Impl " )
	else
            printtofunc( var " " )
    }
    printtofunc( class "::" );
    while ( i  < nr && b[i + 1] != ");"  )
    {
        if( b[i] == "in" )
        {
	    if(b[i + 1] != "float" && b[i + 1] != "unsigned" && b[i+1] != "short" && b[i+1] != "bool" )
	    #if(b[i + 1] != "float" && match(b[i + 1], "unsigned") == 0)
	    {
	        float = "ok"
	        printtofunc( "const " )
            }
	    else
	    {
	        float = "bad"
	    }
            i++
            while ( i + 1 < nr && b[i + 1] != "in" && b[i + 1] != ");" )
            {
	        var =  b[i++]
                if(match(var, "SVG") != 0 )
                    printtofunc( var "Impl " )
	        else
                    printtofunc( var " " )
            }
	    if( float == "ok")
	    {
	        printtofunc( "&" b[i++]  )
	    }
            else
            {
	        printtofunc( b[i++]  )
            }
            if( i < nr ) printtofunc( " " )
        }
        else
            printtofunc( b[i++] )
    }
    printtofunc( ")\n{\n}\n\n" );
}

function doFunc( a )
{
    gsub("attribute", "", $0)  
    nr = split($0, b, " ")
    printg( "\t" )
    # do method
    i = 1
    while ( i  < nr && b[i + 1] != "(" )
    {
        var = b[i++]
        if(match(var, "SVG") != 0 )
            printg( var "Impl " )
	else
            printg( var " " )
    }    
    while ( i  < nr && b[i + 1] != ");"  )
    {
        if( b[i] == "in" )
	{
	    if(b[i + 1] != "float" && b[i + 1] != "unsigned" && b[i+1] != "short" && b[i+1] != "bool" )
	    {
	        float = "ok"
	        printg( "const " )
            }
	    else
	    {
	        float = "bad"
	    }
	    i++
	    while ( i + 1 < nr && b[i + 1] != "in" && b[i + 1] != ");" )
	    {
	        var =  b[i++]
                if(match(var, "SVG") != 0 )
                    printg( var "Impl " )
	        else
                    printg( var " " )
	    }
	    if( float == "ok")
	    {
	        if( b[ i ] != "in" ) printg( "&" b[i++]  )
	    }
            else
            {
	        if( b[ i ] != "in" ) printg( b[i++]  )
            }
            if( i < nr ) printg( " " )
	}
	else
            printg( b[i++] )
    }
    printg( ");\n" );
}

function doAttr( a, class )
{
    sub( ";", "", a)
    sub( "\r", "", a)
    gsub("attribute", "", a)  
    nr = split(a, b, " ")

    # do put method
    printg( "\tvoid set" )
    printg( toupper( substr( b[nr], 1, 1) ) )
    printg( substr( b[nr], 2) "(" )
    i = 1
    if(b[i] != "float" && b[i] != "unsigned" && b[i] != "short" && b[i] != "bool" )
    {
        float = "ok"
        printg( "const " )
    }
    else
    {
        float = "bad"
    }
    while ( i  < nr  )
    {
        var = b[i++]
        if(match(var, "SVG") != 0 )
            printg( var "Impl" )
	else
            printg( var )
	if( i < nr ) printg( " " )
    }
    if( float == "ok")
        printg( " &" )
    else
        printg( " " )n
    printg( b[nr] ");\n" )

    # do put method .cc
    printtofunc( "void " clas "::set" )
    printtofunc( toupper( substr( b[nr], 1, 1) ) )
    printtofunc( substr( b[nr], 2) "(" )
    i = 1
    if(b[i] != "float" && b[i] != "unsigned" && b[i] != "short" && b[i] != "bool" )
    {
        float = "ok"
        printtofunc( "const " )
    }
    else
    {
        float = "bad"
    }
    while ( i  < nr  )
    {
        var = b[i++]
        if(match(var, "SVG") != 0 )
            printtofunc( var "Impl" )
	else
            printtofunc( var )
	if( i < nr ) printtofunc( " " )
    }
    if( float == "ok")
        printtofunc( " &" )
    else
        printtofunc( " " )
    printtofunc( b[nr] ")\n{\n\tm_" b[nr] " = " b[nr] ";\n}\n\n" )


    # do get method .h
    i = 1
    printg( "\t" )
    while ( i  < nr  )
    {
        var = b[i++]
        if(match(var, "SVG") != 0 )
            printg( var "Impl *" )
	else
            printg( var " " )
    }
    sub( ";", "", b[nr])
    sub( "\r", "", b[nr])
    $temp = b[nr]
    printg( $temp "() const;\n" )

    # do get method .cc
    i = 1
    while ( i  < nr  )
    {
        var = b[i++]
        if(match(var, "SVG") != 0 )
            printtofunc( var "Impl *" )
	else
            printtofunc( var " " )
    }
    sub( ";", "", b[nr])
    sub( "\r", "", b[nr])
    $temp = b[nr]
    printtofunc( clas "::" $temp "() const\n{\n\treturn m_" $temp )
    printtofunc( ";\n}\n\n" )
    
    # do var
    i = 1
    printp( "\t" )
    while ( i  < nr  )
    {
        var = b[i++]
        if(match(var, "SVG") != 0 )
        {
            var = var "Impl"
            printp( var  " *" )
        }
        else
            printp( var " " )
    }
    printp( "m_" )
    #printp( toupper( substr( b[nr], 1, 1) ) )
    printp( substr( b[nr], 1) ";\n" )

    #add to ctor + dtor
    if(match(var, "SVG") != 0)
    {
        printtoctor("\tm_" substr( b[nr], 1) " = new " var "();\n" )
        printtoctor("\tm_" substr( b[nr], 1) "->ref();\n\n" )
        printtodtor("\tif(m_" substr( b[nr], 1) ")\n" )
        printtodtor("\t\tm_" substr( b[nr], 1) "->deref();\n\n" )
    }
}

function doReadonlyAttr( a, class )
{
    gsub("readonly attribute", "", $0)  
    nr = split($0, b, " ")
    
    # do get method .h
    i = 1
    printg( "\t" )
    while ( i  < nr  )
    {
        var = b[i++]
        if(match(var, "SVG") != 0 )
            printg( var "Impl *" )
	else
            printg( var " " )
    }
    sub( ";", "", b[nr])
    sub( "\r", "", b[nr])
    $temp = b[nr]
    printg( $temp "() const;\n" )

    # do get method .cc
    i = 1
    while ( i  < nr  )
    {
        var = b[i++]
        if(match(var, "SVG") != 0 )
            printtofunc( var "Impl *" )
	else
            printtofunc( var " " )
    }
    sub( ";", "", b[nr])
    sub( "\r", "", b[nr])
    $temp = b[nr]
    printtofunc( clas "::" $temp "() const\n{\n\treturn m_" $temp )
    printtofunc( ";\n}\n\n" )
    
    # do var
    i = 1
    printp( "\t" )
    while ( i  < nr  )
    {
        var = b[i++]
        if(match(var, "SVG") != 0 )
        {
            var = var "Impl"
            printp( var  " *" )
        }
        else
            printp( var " " )
    }
    printp( "m_" )
    printp( substr( b[nr], 1) ";\n" )

    #add to ctor + dtor
    if(match(var, "SVG") != 0)
    {
        printtoctor("\tm_" substr( b[nr], 1) " = new " var "();\n" )
        printtoctor("\tm_" substr( b[nr], 1) "->ref();\n\n" )
        printtodtor("\tif(m_" substr( b[nr], 1) ")\n" )
        printtodtor("\t\tm_" substr( b[nr], 1) "->deref();\n\n" )
    }
}
{
 sub("boolean", "bool", $0); # to shut up frerich :P
                             # Frerich: Thank you :-)
 if(/interface /)
 {
   private = "\nprivate:\n";
   gsub("  interface ", "", $0) 
   gsub(": ", ": public ", $0) 
   gsub(",", ", public", $0) 
   gsub("{", "\n{", $0) 
   sub( ";", "", $0 )
   sub( "\r", "", $0 )
   printg( "\nclass " )
   #printg( $0 )
   #printg( "\npublic:\n" )   
   nr = split($0, b, " ")
   clas = b[1] "Impl"
   printg( clas " " )
   i = 2
   while ( i  < nr  )
   {
      if(match(b[i], "SVG") != 0 )
      {
          if(match(b[i], ",") != 0)
              sub( ",", "Impl," , b[i]) 
          else
	      b[i] = b[i] "Impl"
      }
      printg( b[i++] " " ) 
   }
   printg( "\n{\npublic:\n" )
   printg( "\t"  clas "();\n" )
   #printg( "\t"  clas "(const " clas " &other)" )
   #if( nr > 2 )
   #{
   #    i = 2
   #    sub( ":", " : ", b[i] )
   #    while ( i  < nr  )
   #    {
   #       sub( "public", "", b[i] )
   #       sub( ",", "(), ", b[i] )
   #       printg( b[i++] ) 
   #    }
   #    printg( "()" )
   #}
   #printg( " { *this = other; }\n" )

   printg( "\tvirtual ~" clas "();\n\n" )
   #printg( "\t"  clas " &operator=(const " clas " &other);\n\n" )

   # CC part
   #printh( "// " b[1] " implementation \n\n" )
   printtoctor( clas "::" clas "()" )
   if( nr > 2 )
   {
       i = 2
       sub( ":", " : ", b[i] )
       while ( i  < nr  )
       {
          sub( "public", "",b[i] )
          sub( ",", "(), ", b[i] )
          printtoctor( b[i++] ) 
       }	

       printtoctor( "()" )
   }
   printtoctor( "\n{\n" )

   printtodtor( clas "::~" clas "()\n{\n" )
   #printh( clas " &" clas "::operator =(const " clas " &other)\n{\n\treturn *this;\n}\n\n" )

 }
 else if(/readonly attribute/)
 {
     doReadonlyAttr( $0, $class )
 }
 else if(/attribute /)
 {
     doAttr( $0, $class )
 }
 else if(/raises/)
 { 
 }
 else if(/\)/)
 { 
    doFuncCC( $0, clas );
    doFunc( $0 );
 }
 else if(/};/)
 { 
    printg(private)
    printg( "};\n\n" );

    printh( "\n" ctor )
    printh( "}\n\n" )
    ctor = ""

    printh( dtor )
    printh( "}\n\n" )
    dtor = ""

    printh( fun )
    fun = ""
 }
 else if(/ = /)
 { 
#    sub( "\r", "", $0 )
#    printg( $0 "\n" );
 }
 #else  if(//)
 #{
 #  # end of class
 #  printf $0;
 #}
}
# END
# {
#    print "};";
# }
