Better distance function
[text-levenshtein-edlib.git] / Edlib.xs
CommitLineData
a99d15a3
MG
1#define PERL_NO_GET_CONTEXT
2#include "EXTERN.h"
3#include "perl.h"
4#include "XSUB.h"
5
6#include "ppport.h"
7
8#include <edlib.h>
9
10#include "const-c.inc"
11
12MODULE = Text::Levenshtein::Edlib PACKAGE = Text::Levenshtein::Edlib
13
14INCLUDE: const-xs.inc
15PROTOTYPES: ENABLE
16
17SV*
18edlibAlign(const char *query, int length(query), const char *target, int length(target), int k, int mode, int task)
19PREINIT:
20 EdlibAlignResult align_result;
21 SV *returned_av_ref;
22 AV *returned_av, *endAV, *startAV, *alignAV;
23 int i;
24CODE:
25 align_result = edlibAlign(query, XSauto_length_of_query, target, XSauto_length_of_target, edlibNewAlignConfig(k, mode, task));
26 returned_av = newAV();
27 av_push(returned_av, newSViv(align_result.editDistance));
28 av_push(returned_av, newSViv(align_result.alphabetLength));
29 if(align_result.endLocations == NULL)
30 av_push(returned_av, &PL_sv_undef);
31 else {
32 endAV = newAV();
33 for(i = 0 ; i < align_result.numLocations ; i++)
34 av_push(endAV, newSViv(align_result.endLocations[i]));
35 av_push(returned_av, newRV_noinc((SV*)endAV));
36 }
37 if(align_result.startLocations == NULL)
38 av_push(returned_av, &PL_sv_undef);
39 else {
40 startAV = newAV();
41 for(i = 0 ; i < align_result.numLocations ; i++)
42 av_push(startAV, newSViv(align_result.startLocations[i]));
43 av_push(returned_av, newRV_noinc((SV*)startAV));
44 }
45 if(align_result.alignment == NULL)
46 av_push(returned_av, &PL_sv_undef);
47 else {
48 startAV = newAV();
49 for(i = 0 ; i < align_result.alignmentLength ; i++)
50 av_push(startAV, newSViv(align_result.alignment[i]));
51 av_push(returned_av, newRV_noinc((SV*)startAV));
52 }
53 edlibFreeAlignResult(align_result);
54 RETVAL = newRV_noinc((SV*)returned_av);
55OUTPUT:
56 RETVAL
329961ff
MG
57
58
59char*
60edlibAlignmentToCigar(unsigned char *alignment, int length(alignment), int format)
This page took 0.013377 seconds and 4 git commands to generate.