/*
 * BRLTTY - A background process providing access to the console screen (when in
 *          text mode) for a blind person using a refreshable braille display.
 *
 * Copyright (C) 1995-2023 by The BRLTTY Developers.
 *
 * BRLTTY comes with ABSOLUTELY NO WARRANTY.
 *
 * This is free software, placed under the terms of the
 * GNU Lesser General Public License, as published by the Free Software
 * Foundation; either version 2.1 of the License, or (at your option) any
 * later version. Please see the file LICENSE-LGPL for details.
 *
 * Web Page: http://brltty.app/
 *
 * This software is maintained by Dave Mielke <dave@mielke.cc>.
 */

// package org.a11y.BRLTTY;

public class brltty {
  public enum ProgramExitStatus {
    SUCCESS  (0),
    FORCE    (1),
    SYNTAX   (2),
    SEMANTIC (3),
    FATAL    (4);

    public final int value;

    ProgramExitStatus (int value) {
      this.value = value;
    }
  }

  public static native int construct (String[] arguments);
  public static native boolean update ();
  public static native void destruct ();

  public static void main (String[] arguments) {
    int exitStatus = construct(arguments);

    if (exitStatus == ProgramExitStatus.SUCCESS.value) {
      while (update()) {
      }
    } else if (exitStatus == ProgramExitStatus.FORCE.value) {
      exitStatus = ProgramExitStatus.SUCCESS.value;
    }

    destruct();
    System.exit(exitStatus);
  }

  static {
    System.loadLibrary("brltty_jni");
  }
}
