X-Git-Url: http://lists.indexdata.dk/cgi-bin?a=blobdiff_plain;ds=sidebyside;f=SimpleServer.xs;h=d0fa5e9c15e1b0e43dc649728cd549cdf9b081ab;hb=3c0071bd93092f0686a26d8e0ed0c99fc2452afc;hp=eb492e3f30eb104248b6cbee9095f0e2a48d0d32;hpb=bbae3fcc7f1b9cf30cbfdd1ab3d7784b618ad6cc;p=simpleserver-moved-to-github.git diff --git a/SimpleServer.xs b/SimpleServer.xs index eb492e3..d0fa5e9 100644 --- a/SimpleServer.xs +++ b/SimpleServer.xs @@ -40,6 +40,7 @@ #include #include #include +#include #ifdef WIN32 #else #include @@ -91,15 +92,13 @@ PerlInterpreter *root_perl_context; */ char *string_or_undef(SV **svp, ODR stream) { STRLEN len; - char *ptr, *buf; + char *ptr; if (!SvOK(*svp)) return 0; ptr = SvPV(*svp, len); - buf = (char*) odr_malloc(stream, len+1); - strcpy(buf, ptr); - return buf; + return odr_strdupn(stream, ptr, len); } @@ -1421,6 +1420,7 @@ int bend_scan(void *handle, bend_scan_rr *rr) struct scan_entry *scan_list; struct scan_entry *buffer; int *step_size = rr->step_size; + int scan_list_size = rr->num_entries; int i; char **basenames; SV **temp; @@ -1514,7 +1514,12 @@ int bend_scan(void *handle, bend_scan_rr *rr) rr->errcode = SvIV(err_code); rr->num_entries = SvIV(number); rr->status = SvIV(status); + if (yaz_version(NULL, NULL) >= 0x4022c && rr->num_entries <= scan_list_size) { + /* entries has been initialized by yaz and is big enough to hold all entries */ + scan_list = rr->entries; + } else { scan_list = (struct scan_entry *) odr_malloc (rr->stream, rr->num_entries * sizeof(*scan_list)); + } buffer = scan_list; entries = (AV *)SvRV(entries_ref); if (rr->errcode == 0) for (i = 0; i < rr->num_entries; i++) @@ -1522,10 +1527,15 @@ int bend_scan(void *handle, bend_scan_rr *rr) scan_item = (HV *)SvRV(sv_2mortal(av_shift(entries))); temp = hv_fetch(scan_item, "TERM", 4, 1); ptr = SvPV(*temp, len); - buffer->term = (char *) odr_malloc (rr->stream, len + 1); - strcpy(buffer->term, ptr); + buffer->term = odr_strdupn(rr->stream, ptr, len); temp = hv_fetch(scan_item, "OCCURRENCE", 10, 1); buffer->occurrences = SvIV(*temp); + temp = hv_fetch(scan_item, "DISPLAY_TERM", 12, 0); + if (temp) + { + ptr = SvPV(*temp, len); + buffer->display_term = odr_strdupn(rr->stream, ptr,len); + } buffer++; hv_undef(scan_item); }