/*
 * Copyright (c) 1997, 2000, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/**/

import java.io.*;


public class ABCOutputStream extends OutputStream {

    int len;
    int count = 0;
    char next = ABCInputStream.firstChar();

    ABCOutputStream(int len) {
        this.len = len;
    }

    public void write(int c) throws IOException {
        if (count >= len)
            throw new IOException("Wrote too many characters");
        if (c != next)
            throw new IOException("Wrong character written: "
                                  + "Expected '" + next + "', "
                                  + "got '" + (char)c + "'");
        next = ABCInputStream.nextChar(next);
        count++;
    }

    public void write(byte buf[], int off, int len) throws IOException {
        for (int i = off; i < off + len; i++)
            write(buf[i]);
    }

    public void close() throws IOException {
        if (len == 0)
            throw new IOException("Already closed");
        else if (count < len)
            throw new IOException("Wrote too few characters");
        len = 0;
    }

}
