/* liblouis Braille Translation and Back-Translation Library

   Based on the Linux screenreader BRLTTY, copyright (C) 1999-2006 by The
   BRLTTY Team

   Copyright (C) 2004, 2005, 2006 ViewPlus Technologies, Inc. www.viewplus.com
   Copyright (C) 2004, 2005, 2006 JJB Software, Inc. www.jjb-software.com
   Copyright (C) 2016 Mike Gray, American Printing House for the Blind
   Copyright (C) 2016 Davy Kager, Dedicon

   This file is part of liblouis.

   liblouis is free software: you can redistribute it and/or modify it
   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.

   liblouis 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
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with liblouis. If not, see <http://www.gnu.org/licenses/>.
*/

/**
 * @file
 * @brief Public API of liblouis
 */

#ifndef __LIBLOUIS_H_
#define __LIBLOUIS_H_
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

// clang-format interacts badly with @foo@
// clang-format off
typedef @WIDECHAR_TYPE@ widechar;
// clang-format on
typedef unsigned short formtype;

#ifdef _MSC_VER
#ifdef _EXPORTING
#define LIBLOUIS_API __declspec(dllexport)
#else
#define LIBLOUIS_API __declspec(dllimport)
#endif
#else
#define LIBLOUIS_API
#endif

#ifdef __EMSCRIPTEN__
#include "emscripten.h"
#define EXPORT_CALL EMSCRIPTEN_KEEPALIVE
#elif defined(_WIN32)
#define EXPORT_CALL __stdcall
LIBLOUIS_API
char *EXPORT_CALL
lou_getProgramPath(void);
#else
#define EXPORT_CALL
#endif

typedef enum {
	plain_text = 0x0000,
	emph_1 = 0x0001,
	emph_2 = 0x0002,
	emph_3 = 0x0004,
	emph_4 = 0x0008,
	emph_5 = 0x0010,
	emph_6 = 0x0020,
	emph_7 = 0x0040,
	emph_8 = 0x0080,
	emph_9 = 0x0100,
	emph_10 = 0x0200,
	computer_braille = 0x0400,
	no_translate = 0x0800,
	no_contract = 0x1000,
	// SYLLABLE_MARKER_1  0x2000,
	// SYLLABLE_MARKER_1  0x4000
	// CAPSEMPH  0x4000
} typeforms;

#define italic emph_1
#define underline emph_2
#define bold emph_3

#define comp_emph_1 emph_1
#define comp_emph_2 emph_2
#define comp_emph_3 emph_3

#define EMPH_NAME_BOLD "bold"
#define EMPH_NAME_ITALIC "italic"
#define EMPH_NAME_UNDERLINE "underline"

typedef enum {
	noContractions = 1,
	compbrlAtCursor = 2,
	dotsIO = 4,
	// for historic reasons 8 and 16 are free
	compbrlLeftCursor = 32,
	ucBrl = 64,
	noUndefined = 128,
	partialTrans = 256
} translationModes;

#define noUndefinedDots noUndefined

LIBLOUIS_API
const char *EXPORT_CALL
lou_version(void);

/**
 * Return the size of widechar
 */
LIBLOUIS_API
int EXPORT_CALL
lou_charSize(void);

LIBLOUIS_API
int EXPORT_CALL
lou_translateString(const char *tableList, const widechar *inbuf, int *inlen,
		widechar *outbuf, int *outlen, formtype *typeform, char *spacing, int mode);

LIBLOUIS_API
int EXPORT_CALL
lou_translate(const char *tableList, const widechar *inbuf, int *inlen, widechar *outbuf,
		int *outlen, formtype *typeform, char *spacing, int *outputPos, int *inputPos,
		int *cursorPos, int mode);

LIBLOUIS_API
int EXPORT_CALL
lou_translatePrehyphenated(const char *tableList, const widechar *inbuf, int *inlen,
		widechar *outbuf, int *outlen, formtype *typeform, char *spacing, int *outputPos,
		int *inputPos, int *cursorPos, char *inputHyphens, char *outputHyphens, int mode);

LIBLOUIS_API
int EXPORT_CALL
lou_hyphenate(
		const char *tableList, const widechar *inbuf, int inlen, char *hyphens, int mode);

/**
 * Convert a string of dot patterns to a string of chars
 *
 * @param[in]  tableList comma separated list of braille tables
 * @param[in]  inbuf widechar string of dot patterns, either in liblouis format or Unicode
 * braille
 * @param[out] outbuf widechar string corresponding to the dot patterns in `inbuf`
 * @param[in,out] length of both `inbuf` and `outbuf`
 * @param[in] mode (deprecated)
 *
 * @return 1 on success and 0 on failure.
 */
LIBLOUIS_API
int EXPORT_CALL
lou_dotsToChar(
		const char *tableList, widechar *inbuf, widechar *outbuf, int length, int mode);
LIBLOUIS_API
int EXPORT_CALL
lou_charToDots(const char *tableList, const widechar *inbuf, widechar *outbuf, int length,
		int mode);
LIBLOUIS_API
int EXPORT_CALL
lou_backTranslateString(const char *tableList, const widechar *inbuf, int *inlen,
		widechar *outbuf, int *outlen, formtype *typeform, char *spacing, int mode);

LIBLOUIS_API
int EXPORT_CALL
lou_backTranslate(const char *tableList, const widechar *inbuf, int *inlen,
		widechar *outbuf, int *outlen, formtype *typeform, char *spacing, int *outputPos,
		int *inputPos, int *cursorPos, int mode);
/**
 * Print error messages to a file
 *
 * @deprecated As of 2.6.0, applications using liblouis should
 * implement their own logging system.
 */
LIBLOUIS_API
void EXPORT_CALL
lou_logPrint(const char *format, ...);

/**
 * Specify the name of the file to be used by lou_logPrint.
 *
 * If it is not used, this file is stderr
 *
 * @deprecated As of 2.6.0, applications using liblouis should
 * implement their own logging system.
 */
LIBLOUIS_API
void EXPORT_CALL
lou_logFile(const char *filename);

/**
 * Read a character from a file, whether big-endian, little-endian or ASCII8
 *
 * and return it as an integer. EOF at end of file. Mode = 1 on first
 * call, any other value thereafter
 */
LIBLOUIS_API
int EXPORT_CALL
lou_readCharFromFile(const char *fileName, int *mode);

/**
 * Close the log file so it can be read by other functions.
 *
 * @deprecated As of 2.6.0, applications using liblouis should
 * implement their own logging system.
 */
LIBLOUIS_API
void EXPORT_CALL
lou_logEnd(void);

/**
 * Load and compile a translation table
 *
 * Check the table for errors. If none are found load the table into
 * memory and return a pointer to it. If errors are found return a
 * null pointer. It is called by lou_translateString() and
 * lou_backTranslateString() and also by functions in liblouisutdml
 * and by the tools.
 */
LIBLOUIS_API
const void *EXPORT_CALL
lou_getTable(const char *tableList);

/**
 * Check a translation table for errors.
 *
 * If no errors are found it load the table into memory and returns a
 * non-zero value. Else the return value is 0.
 */
LIBLOUIS_API
int EXPORT_CALL
lou_checkTable(const char *tableList);

/**
 * Register a new table resolver. Overrides the default resolver. */
LIBLOUIS_API
void EXPORT_CALL
lou_registerTableResolver(
		char **(EXPORT_CALL *resolver)(const char *table, const char *base));

/**
 * Compile a table entry on the fly at run-time
 *
 * This function enables you to compile a table entry on the fly at
 * run-time. The new entry is added to tableList and remains in
 * force until lou_free() is called. If tableList has not
 * previously been loaded it is loaded and compiled.
 *
 * @param inString contains the table entry to be added. It may be
 * anything valid. Error messages will be produced if it is invalid.
 *
 * @return 1 on success and 0 on failure.
 */
LIBLOUIS_API
int EXPORT_CALL
lou_compileString(const char *tableList, const char *inString);

/**
 * Get the typeform bit for the named emphasis class.
 *
 * If the table defines the specified emphasis class the corresponding
 * typeform is returned. Else the return value is 0.
 */
LIBLOUIS_API
formtype EXPORT_CALL
lou_getTypeformForEmphClass(const char *tableList, const char *emphClass);

/**
 * Return the emphasis class names declared in tableList as a
 * NULL-terminated array of strings. The array is acquired with malloc()
 * and should be released with free(). The strings must not be released,
 * and are no longer valid after lou_free() has been called.
 */
LIBLOUIS_API
char const **EXPORT_CALL
lou_getEmphClasses(const char *tableList);

/**
 * Set the path used for searching for tables and liblouisutdml files.
 *
 * Overrides the installation path. */
LIBLOUIS_API
char *EXPORT_CALL
lou_setDataPath(const char *path);

/**
 * Get the path set in the previous function. */
LIBLOUIS_API
char *EXPORT_CALL
lou_getDataPath(void);

typedef enum {
	LOU_LOG_ALL = 0,
	LOU_LOG_DEBUG = 10000,
	LOU_LOG_INFO = 20000,
	LOU_LOG_WARN = 30000,
	LOU_LOG_ERROR = 40000,
	LOU_LOG_FATAL = 50000,
	LOU_LOG_OFF = 60000
} logLevels;

typedef void(EXPORT_CALL *logcallback)(logLevels level, const char *message);

/**
 * Register logging callbacks
 * Set to NULL for default callback.
 */
LIBLOUIS_API
void EXPORT_CALL
lou_registerLogCallback(logcallback callback);

/**
 * Set the level for logging callback to be called at
 */
LIBLOUIS_API
void EXPORT_CALL
lou_setLogLevel(logLevels level);

typedef enum { LOU_ROW_BRAILLE = 0X2800 } LOU_UnicodeConstants;

/* ========================= Sort-of private API ========================= */

/**
 * Definitions of braille dots
 */
typedef enum BrailleDots {
	LOU_DOT_1 = 0X01,	/** dot 1 */
	LOU_DOT_2 = 0X02,	/** dot 2 */
	LOU_DOT_3 = 0X04,	/** dot 3 */
	LOU_DOT_4 = 0X08,	/** dot 4 */
	LOU_DOT_5 = 0X10,	/** dot 5 */
	LOU_DOT_6 = 0X20,	/** dot 6 */
	LOU_DOT_7 = 0X40,	/** dot 7 */
	LOU_DOT_8 = 0X80,	/** dot 8 */
	LOU_DOT_9 = 0X100,   /** virtual dot 9 */
	LOU_DOT_10 = 0X200,  /** virtual dot A */
	LOU_DOT_11 = 0X400,  /** virtual dot B */
	LOU_DOT_12 = 0X800,  /** virtual dot C */
	LOU_DOT_13 = 0X1000, /** virtual dot D */
	LOU_DOT_14 = 0X2000, /** virtual dot E */
	LOU_DOT_15 = 0X4000, /** virtual dot F */
	LOU_DOTS = 0X8000	/** if this bit is true, the widechar represents a dot pattern */
} BrailleDots;

/**
 * A sentinel, used in liblouisutdml
 */
#define LOU_ENDSEGMENT 0xffff

/* =========================  BETA API ========================= */

// Use the following two function with care, API is subject to change!

/**
 * Parse, analyze and index tables.
 *
 * This function must be called prior to lou_findTable() and
 * lou_listTables(). Table names must be provided as a NULL-terminated
 * array of strings. Each table should resolve to exactly one file. An
 * error message is given when a table contains invalid or duplicate
 * metadata fields.
 */
LIBLOUIS_API
void EXPORT_CALL
lou_indexTables(const char **tables);

/**
 * Find the best match for a query.
 *
 * Returns the name of the table, or NULL when no match can be
 * found. If lou_indexTables() has not been previously called, the
 * table search path specified with LOUIS_TABLEPATH will be indexed
 * first. An error message is given when the query is invalid. Freeing
 * the memory of the returned string is the responsibility of the
 * caller.
 */
LIBLOUIS_API
char *EXPORT_CALL
lou_findTable(const char *query);

/**
 * Find all matches for a query, best match first.
 *
 * Returns the names of the matched table as a NULL-terminated array
 * of string. If lou_indexTables() has not been previously called, the
 * table search path specified with LOUIS_TABLEPATH will be indexed
 * first. An error message is given when the query is invalid. Freeing
 * the memory of the returned array and strings is the responsibility
 * of the caller.
 */
LIBLOUIS_API
char **EXPORT_CALL
lou_findTables(const char *query);

/**
 * Read metadata from a file.
 *
 * Returns the value of the metadata field specified by `key' in
 * `table', or NULL when the field does not exist. Freeing the memory
 * of the returned string is the responsibility of the caller.
 */
LIBLOUIS_API
char *EXPORT_CALL
lou_getTableInfo(const char *table, const char *key);

/**
 * List available tables.
 *
 * Returns the names of available tables as a NULL-terminated array of
 * strings. Only tables that are discoverable, i.e. the have active
 * metadata, are listed. If lou_indexTables() has not been previously
 * called, the table search path specified with LOUIS_TABLEPATH will
 * be indexed first. Freeing the memory of the returned array and
 * strings is the responsibility of the caller.
 */
LIBLOUIS_API
char **EXPORT_CALL
lou_listTables(void);

/* ====================== END OF BETA API ====================== */

/**
 * Free all memory allocated by liblouis.
 *
 * This function should be called at the end of the application to
 * free all memory allocated by liblouis.
 */
LIBLOUIS_API
void EXPORT_CALL
lou_free(void);

#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __LIBLOUIS_H_ */
