Commit bf7c60c6 authored by jkvis's avatar jkvis

Added childtab calculation

parent b46cbbeb
#include <stdio.h>
#include <stdlib.h>
#include "../include/gesa.h"
......@@ -45,10 +46,104 @@ int GESA_calculate_lcp(GESA_char_t const* const string,
} // GESA_calculate_lcp
int GESA_calculate_childtab(GESA const* const gesa,
GESA_index_t* const childtab)
#define GESA_STACK_SIZE 2048
typedef struct
{
GESA_index_t data[GESA_STACK_SIZE];
size_t size;
} GESA_STACK;
static void GESA_STACK_init(GESA_STACK* const stack)
{
stack->size = 0;
} // GESA_STACK_init
static GESA_index_t GESA_STACK_top(GESA_STACK const* const stack)
{
if (stack->size == 0)
{
fprintf(stderr, "Error: GESA_STACK_top()\n");
return -1;
} // if
return stack->data[stack->size - 1];
} // GESA_STACK_top
static void GESA_STACK_push(GESA_STACK* const stack, GESA_index_t data)
{
if (stack->size >= GESA_STACK_SIZE)
{
fprintf(stderr, "Error: GESA_STACK_push()\n");
return;
} // if
stack->data[stack->size] = data;
stack->size += 1;
} // GESA_STACK_push
static void GESA_STACK_pop(GESA_STACK* const stack)
{
if (stack->size == 0)
{
fprintf(stderr, "Error: GESA_STACK_pop()\n");
return;
} // if
stack->size -= 1;
} // GESA_STACK_pop
#undef GESA_STACK_SIZE
void GESA_calculate_childtab(GESA const* const gesa,
GESA_index_t* const childtab)
{
static size_t const STACK_SIZE = 2048;
GESA_STACK stack;
GESA_STACK_init(&stack);
GESA_index_t last_index = -1;
GESA_STACK_push(&stack, 0);
for (size_t i = 1; i < gesa->total; ++i)
{
while (gesa->lcp[i] < gesa->lcp[GESA_STACK_top(&stack)])
{
last_index = GESA_STACK_top(&stack);
GESA_STACK_pop(&stack);
if (gesa->lcp[i] <= gesa->lcp[GESA_STACK_top(&stack)] &&
gesa->lcp[GESA_STACK_top(&stack)] != gesa->lcp[last_index])
{
childtab[GESA_STACK_top(&stack)] = last_index;
} // if
} // while
if (last_index != -1)
{
childtab[i - 1] = last_index;
last_index = -1;
} // if
GESA_index_t stack[STACK_SIZE];
GESA_STACK_push(&stack, i);
} // for
GESA_STACK_init(&stack);
GESA_STACK_push(&stack, 0);
for (size_t i = 1; i < gesa->total; ++i)
{
while (gesa->lcp[i] < gesa->lcp[GESA_STACK_top(&stack)])
{
GESA_STACK_pop(&stack);
} // while
if (gesa->lcp[i] == gesa->lcp[GESA_STACK_top(&stack)])
{
childtab[GESA_STACK_top(&stack)] = i;
GESA_STACK_pop(&stack);
} // if
GESA_STACK_push(&stack, i);
} // for
} // GESA_calculate_childtab
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment