/*
 * 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>.
 */

#ifndef BRLTTY_INCLUDED_DATAFILE
#define BRLTTY_INCLUDED_DATAFILE

#include <stdio.h>

#include "variables.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

extern int setBaseDataVariables (const VariableInitializer *initializers);
extern int setTableDataVariables (const char *tableExtension, const char *subtableExtension);

extern FILE *openDataFile (const char *path, const char *mode, int optional);

typedef struct DataFileStruct DataFile;

#define DATA_OPERANDS_PROCESSOR(name) int name (DataFile *file, void *data)
typedef DATA_OPERANDS_PROCESSOR(DataOperandsProcessor);

typedef enum {
  DFO_NO_COMMENTS = 0X01
} DataFileOptions;

typedef struct {
  DataOperandsProcessor *processOperands;
  void (*logFileName) (const char *name, void *data);
  void *data;
  unsigned char options;
} DataFileParameters;

extern int processDataFile (const char *name, const DataFileParameters *parameters);
extern void reportDataError (DataFile *file, const char *format, ...) PRINTF(2, 3);

extern int processDataStream (
  DataFile *includer,
  FILE *stream, const char *name,
  const DataFileParameters *parameters
);

extern int compareKeyword (const wchar_t *keyword, const wchar_t *characters, size_t count);
extern int compareKeywords (const wchar_t *keyword1, const wchar_t *keyword2);

extern int isKeyword (const wchar_t *keyword, const wchar_t *characters, size_t count);
extern int isNumber (int *number, const wchar_t *characters, int length);
extern int isHexadecimalDigit (wchar_t character, int *value, int *shift);
extern int isOctalDigit (wchar_t character, int *value, int *shift);

extern int findDataOperand (DataFile *file, const char *description);
extern int getDataCharacter (DataFile *file, wchar_t *character);
extern int ungetDataCharacters (DataFile *file, unsigned int count);

typedef struct {
  const wchar_t *characters;
  int length;
} DataOperand;

extern int getDataOperand (DataFile *file, DataOperand *operand, const char *description);
extern int getTextOperand (DataFile *file, DataOperand *text, const char *description);
extern void getTextRemaining (DataFile *file, DataOperand *text);

typedef struct {
  unsigned char length;
  wchar_t characters[0XFF];
} DataString;

extern int parseDataString (DataFile *file, DataString *string, const wchar_t *characters, int length, int noUnicode);
extern int getDataString (DataFile *file, DataString *string, int noUnicode, const char *description);

extern int writeHexadecimalCharacter (FILE *stream, wchar_t character);
extern int writeEscapedCharacter (FILE *stream, wchar_t character);
extern int writeEscapedCharacters (FILE *stream, const wchar_t *characters, size_t count);

typedef struct {
  unsigned char length;
  unsigned char bytes[0XFF];
} ByteOperand;

#define CELLS_OPERAND_DELIMITER WC_C('-')
#define CELLS_OPERAND_SPACE WC_C('0')

extern int parseCellsOperand (DataFile *file, ByteOperand *cells, const wchar_t *characters, int length);
extern int getCellsOperand (DataFile *file, ByteOperand *cells, const char *description);

extern int writeDots (FILE *stream, unsigned char cell);
extern int writeDotsCell (FILE *stream, unsigned char cell);
extern int writeDotsCells (FILE *stream, const unsigned char *cells, size_t count);

extern int writeUtf8Cell (FILE *stream, unsigned char cell);
extern int writeUtf8Cells (FILE *stream, const unsigned char *cells, size_t count);

typedef struct {
  const wchar_t *name;
  DataOperandsProcessor *processor;
  unsigned char unconditional : 1;
} DataDirective;

typedef struct {
  struct {
    const DataDirective *table;
    size_t count;
  } const unsorted;

  struct {
    const DataDirective **table;
    size_t count;
  } sorted;

  const DataDirective *unnamed;
} DataDirectives;

#define BEGIN_DATA_DIRECTIVE_TABLE \
  static const DataDirective unsortedDirectives[] = {

#define END_DATA_DIRECTIVE_TABLE }; \
  static DataDirectives directives = { \
    .unsorted = { \
      .table = unsortedDirectives, \
      .count = ARRAY_COUNT(unsortedDirectives) \
    }, \
    \
    .sorted = { \
      .table = NULL, \
      .count = 0 \
    }, \
    \
    .unnamed = NULL \
  };

extern int processDirectiveOperand (DataFile *file, DataDirectives *directives, const char *description, void *data);

#define DATA_CONDITION_TESTER(name) int name (DataFile *file, const DataOperand *identifier, void *data)
typedef DATA_CONDITION_TESTER(DataConditionTester);

extern int processConditionOperands (
  DataFile *file,
  DataConditionTester *testCondition, int negateCondition,
  const char *description, void *data
);

extern DATA_OPERANDS_PROCESSOR(processIncludeOperands);
extern int includeDataFile (DataFile *file, const wchar_t *name, int length);

#define DATA_NESTING_DIRECTIVES \
  {.name=WS_C("include"), .processor=processIncludeOperands}

extern DATA_OPERANDS_PROCESSOR(processElseOperands);
extern DATA_OPERANDS_PROCESSOR(processEndIfOperands);

#define DATA_CONDITION_DIRECTIVES \
  {.name=WS_C("else"), .processor=processElseOperands, .unconditional=1}, \
  {.name=WS_C("endif"), .processor=processEndIfOperands, .unconditional=1}

extern DATA_OPERANDS_PROCESSOR(processIfVarOperands);
extern DATA_OPERANDS_PROCESSOR(processIfNotVarOperands);
extern DATA_OPERANDS_PROCESSOR(processBeginVariablesOperands);
extern DATA_OPERANDS_PROCESSOR(processEndVariablesOperands);
extern DATA_OPERANDS_PROCESSOR(processListVariablesOperands);
extern DATA_OPERANDS_PROCESSOR(processAssignDefaultOperands);
extern DATA_OPERANDS_PROCESSOR(processAssignOperands);

#define DATA_VARIABLE_DIRECTIVES \
  {.name=WS_C("ifvar"), .processor=processIfVarOperands, .unconditional=1}, \
  {.name=WS_C("ifnotvar"), .processor=processIfNotVarOperands, .unconditional=1}, \
  {.name=WS_C("beginvariables"), .processor=processBeginVariablesOperands}, \
  {.name=WS_C("endvariables"), .processor=processEndVariablesOperands}, \
  {.name=WS_C("listvariables"), .processor=processListVariablesOperands}, \
  {.name=WS_C("assigndefault"), .processor=processAssignDefaultOperands}, \
  {.name=WS_C("assign"), .processor=processAssignOperands}

#define BRL_DOT_COUNT 8
extern const wchar_t brlDotNumbers[BRL_DOT_COUNT];
extern const unsigned char brlDotBits[BRL_DOT_COUNT];
extern int brlDotNumberToIndex (wchar_t number, int *index);
extern int brlDotBitToIndex (unsigned char bit, int *index);

extern int getDotOperand (DataFile *file, int *index);

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* BRLTTY_INCLUDED_DATAFILE */
