The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"

void process_buffer(char* buffer, int window, HV** counts_hv) {
    HV* counts;
    int balance = window / 2;
    
    if (window & 1)
        balance++;

    if (!counts_hv || !*counts_hv)
        *counts_hv = newHV();

    counts = *counts_hv;

    buffer += balance;
    while (*buffer && *(buffer + balance-2))
        sv_inc(*hv_fetch(counts, buffer++ - balance, window, TRUE));
}

MODULE = Text::Ngram		PACKAGE = Text::Ngram		

HV* 
process_buffer(buffer, window)
    char* buffer
    int   window
    CODE:
    {
        HV* newhv = NULL;
        process_buffer(buffer, window, &newhv);
        RETVAL=newhv;
    }
    OUTPUT:
        RETVAL

void
process_buffer_incrementally(buffer, window, hash)
    char* buffer
    int   window
    HV*   hash
    CODE:
        process_buffer(buffer, window, &hash);