TeX/src/env.c

109 lines
2.1 KiB
C

#include <TeX/node.h>
#include <TeX/flow.h>
#include <TeX/env.h>
#include <stdlib.h>
#include <string.h>
//---
// Primary environment: a simple flow
//
// This environment ignores separators and breaks and concatenates all
// nodes in a single flow. It is the type of the outermost environment of
// any formula.
//---
struct TeX_Env_Primary
{
struct TeX_Env env;
struct TeX_Flow *flow;
};
static void primary_free(struct TeX_Env *env)
{
struct TeX_Env_Primary *p = (void *)env;
TeX_flow_free(p->flow);
}
static void primary_add_node(struct TeX_Env *env, struct TeX_Node *node)
{
struct TeX_Env_Primary *p = (void *)env;
p->flow = TeX_flow_add_node(p->flow, node);
}
static void primary_size(struct TeX_Env *env)
{
struct TeX_Env_Primary *p = (void *)env;
TeX_flow_layout(p->flow);
p->env.width = p->flow->width;
p->env.height = p->flow->height;
p->env.line = p->flow->line;
}
static void primary_render(struct TeX_Env *env, int x, int y, int color)
{
struct TeX_Env_Primary *p = (void *)env;
TeX_flow_render(p->flow, x, y, color);
}
struct TeX_Env *TeX_env_primary(void)
{
struct TeX_Env_Primary *p = malloc(sizeof *p);
struct TeX_Env *env = (void *)p;
env->name = "primary";
env->free = primary_free;
env->add_node = primary_add_node;
env->add_separator = NULL;
env->add_break = NULL;
env->size = primary_size;
env->render = primary_render;
p->flow = NULL;
return env;
}
//---
// Matrix environment.
//---
/* TODO */
//---
// Environment printers
//---
#ifdef TEX_PRINT
#include <stdio.h>
#include <TeX/print.h>
/* TeX_print_env_primary(): Print a primary environment to stdout */
void TeX_print_env_primary(struct TeX_Env *env, int indent)
{
struct TeX_Env_Primary *p = (void *)env;
printf("%*s", indent, "");
printf("{primary}\n");
TeX_print_flow(p->flow, indent + 2);
}
/* TeX_print_env(): Recursively print an environment */
void TeX_print_env(struct TeX_Env *env, int indent)
{
if(!strcmp(env->name, "primary"))
{
TeX_print_env_primary(env, indent);
}
else
{
printf("%*s{%s} (?)\n", indent, "", env->name);
}
}
#endif /* TEX_PRINT */