/*
- * $Id: SimpleServer.xs,v 1.64 2007-08-08 12:11:42 mike Exp $
+ * $Id: SimpleServer.xs,v 1.69 2007-08-17 12:31:40 mike Exp $
* ----------------------------------------------------------------------
*
* Copyright (c) 2000-2004, Index Data.
#include "proto.h"
#include "embed.h"
#include "XSUB.h"
+#include <assert.h>
#include <yaz/backend.h>
#include <yaz/log.h>
#include <yaz/wrbuf.h>
#define GRS_BUF_SIZE 8192
+
+/*
+ * Inspects the SV indicated by svp, and returns a null pointer if
+ * it's an undefined value, or a string allocation from `stream'
+ * otherwise. Using this when filling in addinfo avoids those
+ * irritating "Use of uninitialized value in subroutine entry"
+ * warnings from Perl.
+ */
+char *string_or_undef(SV **svp, ODR stream) {
+ STRLEN len;
+ char *ptr, *buf;
+
+ if (!SvOK(*svp))
+ return 0;
+
+ ptr = SvPV(*svp, len);
+ buf = (char*) odr_malloc(stream, len+1);
+ strcpy(buf, ptr);
+ return buf;
+}
+
+
CV * simpleserver_sv2cv(SV *handler) {
STRLEN len;
char *buf;
translateOID(elem->attributeSet));
setMember(hv2, "attributeType",
newSViv(*elem->attributeType));
- assert(elem->which == Z_AttributeValue_numeric);
- setMember(hv2, "attributeValue",
- newSViv(*elem->value.numeric));
+ if (elem->which == Z_AttributeValue_numeric) {
+ setMember(hv2, "attributeValue",
+ newSViv(*elem->value.numeric));
+ } else {
+ assert(elem->which == Z_AttributeValue_complex);
+ Z_ComplexAttribute *complex = elem->value.complex;
+ Z_StringOrNumeric *son;
+ /* We ignore semantic actions and multiple values */
+ assert(complex->num_list > 0);
+ son = complex->list[0];
+ if (son->which == Z_StringOrNumeric_numeric) {
+ setMember(hv2, "attributeValue",
+ newSViv(*son->u.numeric));
+ } else { /*Z_StringOrNumeric_string*/
+ setMember(hv2, "attributeValue",
+ newSVpv(son->u.string, 0));
+ }
+ }
av_push(av, tmp);
}
setMember(hv, "attributes", attrs);
HV *href;
AV *aref;
SV **temp;
- char *ODR_errstr;
- STRLEN len;
int i;
char **basenames;
WRBUF query;
- char *ptr;
SV *point;
Zfront_handle *zhandle = (Zfront_handle *)handle;
CV* handler_cv = 0;
rr->errcode = SvIV(*temp);
temp = hv_fetch(href, "ERR_STR", 7, 1);
- ptr = SvPV(*temp, len);
- ODR_errstr = (char *)odr_malloc(rr->stream, len + 1);
- strcpy(ODR_errstr, ptr);
- rr->errstring = ODR_errstr;
+ rr->errstring = string_or_undef(temp, rr->stream);
temp = hv_fetch(href, "HANDLE", 6, 1);
point = newSVsv(*temp);
scan_list = (struct scan_entry *) odr_malloc (rr->stream, rr->num_entries * sizeof(*scan_list));
buffer = scan_list;
entries = (AV *)SvRV(entries_ref);
- for (i = 0; i < rr->num_entries; i++)
+ if (rr->errcode == 0) for (i = 0; i < rr->num_entries; i++)
{
scan_item = (HV *)SvRV(sv_2mortal(av_shift(entries)));
temp = hv_fetch(scan_item, "TERM", 4, 1);
char *ptr;
ptr = SvPV(arg, len);
yaz_log(YLOG_LOG, "%.*s", len, ptr);
+
+int
+yaz_diag_srw_to_bib1(srw_code)
+ int srw_code
+
+int
+yaz_diag_bib1_to_srw(bib1_code)
+ int bib1_code
+