#ifndef LANGUAGE_H
#define LANGUAGE_H
#include "arena.h"
#include <stdbool.h>
#include <stddef.h>
typedef enum {
TYPE_VIDEO,
TYPE_AUDIO,
TYPE_COMBINED,
TYPE_SUBTITLES,
TYPE_BURN_STYLE,
TYPE_INDEX,
TYPE_DURATION,
TYPE_SCALAR,
TYPE_BOOL,
TYPE_STRING,
TYPE_CHAPTER,
TYPE_ATTACHMENT,
} ValueType;
typedef enum {
SRC_VIDEO,
SRC_AUDIO,
SRC_COMBINED,
SRC_SUBTITLES,
} SourceKind;
typedef enum {
OP_DUP,
OP_DROP,
OP_SWAP,
OP_OVER,
OP_ROT,
OP_GET_VIDEO,
OP_GET_AUDIO,
OP_GET_SUBTITLES,
OP_SPLIT,
OP_VIDEO_AT,
OP_AUDIO_AT,
OP_SUBTITLES_AT,
OP_TAKE_VIDEO,
OP_TAKE_AUDIO,
OP_TAKE_SUBTITLES,
OP_DROP_VIDEO,
OP_DROP_AUDIO,
OP_DROP_SUBTITLES,
OP_ADD_VIDEO,
OP_ADD_AUDIO,
OP_ADD_SUBTITLES,
OP_REPLACE_VIDEO,
OP_REPLACE_AUDIO,
OP_REPLACE_SUBTITLES,
OP_MOVE_VIDEO,
OP_MOVE_AUDIO,
OP_MOVE_SUBTITLES,
OP_LENGTH,
OP_SLICE,
OP_TAKE,
OP_CONCAT,
OP_DELAY,
OP_MUX,
OP_ATTACH_SUBTITLES,
OP_VIDEO_TO_COMBINED,
OP_BURN_SUBTITLES,
OP_SET_LANGUAGE,
OP_SET_TITLE,
OP_SET_DEFAULT,
OP_SET_FORCED,
OP_CHAPTER,
OP_ADD_CHAPTER,
OP_DROP_CHAPTER,
OP_MOVE_CHAPTER,
OP_ADD_ATTACHMENT,
OP_DROP_ATTACHMENT,
OP_MOVE_ATTACHMENT,
OP_SET_TAG,
OP_VOLUME,
OP_MIX,
OP_SILENCE,
OP_SPEED,
OP_FADE_IN,
OP_FADE_OUT,
OP_ADD,
OP_SUB,
OP_MUL,
OP_DIV,
OP_EQ,
OP_NE,
OP_LT,
OP_LE,
OP_GT,
OP_GE,
OP_AND,
OP_OR,
OP_NOT,
OP_IF,
OP_ELSE,
OP_END,
OP_BEGIN,
OP_WHILE,
OP_REPEAT,
OP_COUNT,
} Operation;
typedef enum {
INST_SOURCE,
INST_DURATION,
INST_SCALAR,
INST_BOOL,
INST_INDEX,
INST_BURN_STYLE,
INST_STRING,
INST_ATTACHMENT,
INST_OPERATION,
} InstructionKind;
typedef struct {
InstructionKind kind;
int line;
union {
struct {
SourceKind kind;
const char* path;
} source;
const char* text;
double number;
Operation op;
} as;
} Instruction;
typedef struct {
Arena arena;
Instruction* items;
size_t count;
size_t capacity;
} Program;
typedef struct {
int line;
char message[256];
} Error;
const char* type_name(ValueType type);
const char* operation_name(Operation operation);
#endif