package @PKGNAME@ ;

import org.omg.CORBA.OMGVMCID ;
import org.omg.CORBA.CompletionStatus ;

import org.omg.CORBA.@SYSEX@ ; 

public abstract class StandardException {
    // @SYSEX@ BAD_CONTEXT

    public void IdlContextNotFound( CompletionStatus completed )
    {
	throw new BAD_CONTEXT( "IDL context not found", 
	    OMGVMCID.value + 1, completed ) ;
    }

    public void IdlContextNotFound( )
    {
	IdlContextNotFound( CompletionStatus.COMPLETED_NO ) ;
    }

Data structures: list[ ... ] vector[ ... ] ( record )

list[ ( string{exception name} list[ ( string{code name} int{value} string{description} ] ) ]
			    
Processing:
    

    open file (fname)
	fr = new FileReader( fname )
	br = new BufferedReader( fr )
	br.readLine() returns null at EOF

    want a BufferedReader
    
    while not eol read line
	if (line start with spaces)
	    add to current index
	else
	    new exception

    create StandardException class

    foreach ( excname vec ) in data
	add import statement for execname to output 

	foreach ( codename value descr ) in vec 
	    generate full method
	    generate short method
	
	   
(define (read-file fname)
    (begin
	(let port (open-input-port fname))
	(let obj  (read port))
	obj
    )
)

    
    
