Initial commit
[text-levenshtein-edlib.git] / Edlib.xs
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
12 MODULE = Text::Levenshtein::Edlib PACKAGE = Text::Levenshtein::Edlib
13
14 INCLUDE: const-xs.inc
15 PROTOTYPES: ENABLE
16
17 SV*
18 edlibAlign(const char *query, int length(query), const char *target, int length(target), int k, int mode, int task)
19 PREINIT:
20 EdlibAlignResult align_result;
21 SV *returned_av_ref;
22 AV *returned_av, *endAV, *startAV, *alignAV;
23 int i;
24 CODE:
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);
55 OUTPUT:
56 RETVAL
This page took 0.021309 seconds and 4 git commands to generate.