blob: 0e8db219ccc05e5919c633f7621b23b585d0890d [file] [log] [blame]
/*
* *****************************************************************************
*
* Copyright 2018 Gavin D. Howard
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
* *****************************************************************************
*
* Definitions for program data.
*
*/
#ifndef BC_DATA_H
#define BC_DATA_H
#include <stdbool.h>
#include <bc.h>
#include <vector.h>
#include <num.h>
#define BC_PROGRAM_MAX_STMTS (128)
#define BC_PROGRAM_DEF_SIZE (16)
typedef enum BcExprType {
BC_EXPR_INC_PRE,
BC_EXPR_DEC_PRE,
BC_EXPR_INC_POST,
BC_EXPR_DEC_POST,
BC_EXPR_NEGATE,
BC_EXPR_POWER,
BC_EXPR_MULTIPLY,
BC_EXPR_DIVIDE,
BC_EXPR_MODULUS,
BC_EXPR_PLUS,
BC_EXPR_MINUS,
BC_EXPR_REL_EQUAL,
BC_EXPR_REL_LESS_EQ,
BC_EXPR_REL_GREATER_EQ,
BC_EXPR_REL_NOT_EQ,
BC_EXPR_REL_LESS,
BC_EXPR_REL_GREATER,
BC_EXPR_BOOL_NOT,
BC_EXPR_BOOL_OR,
BC_EXPR_BOOL_AND,
BC_EXPR_ASSIGN_POWER,
BC_EXPR_ASSIGN_MULTIPLY,
BC_EXPR_ASSIGN_DIVIDE,
BC_EXPR_ASSIGN_MODULUS,
BC_EXPR_ASSIGN_PLUS,
BC_EXPR_ASSIGN_MINUS,
BC_EXPR_ASSIGN,
BC_EXPR_NUMBER,
BC_EXPR_VAR,
BC_EXPR_ARRAY_ELEM,
BC_EXPR_FUNC_CALL,
BC_EXPR_SCALE_FUNC,
BC_EXPR_SCALE,
BC_EXPR_IBASE,
BC_EXPR_OBASE,
BC_EXPR_LAST,
BC_EXPR_LENGTH,
BC_EXPR_READ,
BC_EXPR_SQRT,
BC_EXPR_PRINT,
} BcExprType;
typedef struct BcEntry {
char *name;
size_t idx;
} BcEntry;
typedef struct BcAuto {
char *name;
bool var;
union {
BcNum num;
BcVec array;
} data;
} BcAuto;
typedef struct BcFunc {
BcVec code;
BcVec labels;
BcVec params;
BcVec autos;
} BcFunc;
typedef BcNum BcVar;
typedef BcVec BcArray;
typedef enum BcResultType {
BC_RESULT_INTERMEDIATE,
BC_RESULT_CONSTANT,
BC_RESULT_VAR,
BC_RESULT_ARRAY,
BC_RESULT_SCALE,
BC_RESULT_LAST,
BC_RESULT_IBASE,
BC_RESULT_OBASE,
BC_RESULT_ONE,
} BcResultType;
typedef struct BcResult {
BcResultType type;
union {
BcNum num;
struct {
char *name;
size_t idx;
} id;
} data;
} BcResult;
typedef struct BcInstPtr {
size_t func;
size_t idx;
size_t len;
} BcInstPtr;
typedef BcStatus (*BcDataInitFunc)(void*);
// ** Exclude start. **
BcStatus bc_func_init(BcFunc *func);
BcStatus bc_func_insert(BcFunc *func, char *name, bool var, BcVec *vec);
void bc_func_free(void *func);
BcStatus bc_var_init(void *var);
void bc_var_free(void *var);
BcStatus bc_array_init(void *array);
BcStatus bc_array_copy(void *dest, void *src);
BcStatus bc_array_zero(BcArray *a);
BcStatus bc_array_expand(BcArray *a, size_t len);
void bc_array_free(void *array);
void bc_string_free(void *string);
int bc_entry_cmp(void *entry1, void*entry2);
void bc_entry_free(void *entry);
void bc_result_free(void *result);
void bc_constant_free(void *constant);
// ** Exclude end. **
BcStatus bc_auto_init(void *auto1, char *name, bool var);
void bc_auto_free(void *auto1);
extern const char *bc_lang_func_main;
extern const char *bc_lang_func_read;
#endif // BC_DATA_H