X-Git-Url: http://git.indexdata.com/?p=simpleserver-moved-to-github.git;a=blobdiff_plain;f=SimpleServer.xs;h=aa80eaabb368260e689519b5412455f1a41ecb9b;hp=da613c2f812e954efa29b6837559c127582d5b07;hb=cf966225c35eccdd7fa20dbe842dd9594fccc375;hpb=ef4825a7e6f74209103a34d79243c1e4f03b2a4b diff --git a/SimpleServer.xs b/SimpleServer.xs index da613c2..aa80eaa 100644 --- a/SimpleServer.xs +++ b/SimpleServer.xs @@ -1,5 +1,5 @@ /* - * $Id: SimpleServer.xs,v 1.69 2007-08-17 12:31:40 mike Exp $ + * $Id: SimpleServer.xs,v 1.71 2007-08-17 16:24:40 mike Exp $ * ---------------------------------------------------------------------- * * Copyright (c) 2000-2004, Index Data. @@ -401,31 +401,58 @@ static SV *rpn2perl(Z_RPNStructure *s) SV *sv; HV *hv; AV *av; + SV *sv2; + char *rsid; + Z_Operand *o = s->u.simple; + Z_AttributesPlusTerm *at; switch (s->which) { - case Z_RPNStructure_simple: { - Z_Operand *o = s->u.simple; - Z_AttributesPlusTerm *at; - if (o->which == Z_Operand_resultSetId) { - SV *sv2; - /* This code causes a SIGBUS on my machine, and I have no - idea why. It seems as clear as day to me */ - char *rsid = (char*) o->u.resultSetId; - printf("Encoding resultSetId '%s'\n", rsid); - sv = newObject("Net::Z3950::RPN::RSID", (SV*) (hv = newHV())); - printf("Made sv=0x%lx, hv=0x%lx\n", - (unsigned long) sv ,(unsigned long) hv); - sv2 = newSVpv(rsid, strlen(rsid)); - setMember(hv, "id", sv2); - printf("Set hv{id} to 0x%lx\n", (unsigned long) sv2); - return sv; + default: + fatal("unknown RPN node type %d", (int) s->which); + + case Z_RPNStructure_complex: { + SV *tmp; + Z_Complex *c = s->u.complex; + char *type = 0; /* vacuous assignment satisfies gcc -Wall */ + switch (c->roperator->which) { + case Z_Operator_and: type = "Net::Z3950::RPN::And"; break; + case Z_Operator_or: type = "Net::Z3950::RPN::Or"; break; + case Z_Operator_and_not: type = "Net::Z3950::RPN::AndNot"; break; + case Z_Operator_prox: fatal("proximity not yet supported"); + default: fatal("unknown RPN operator %d", (int) c->roperator->which); } - if (o->which != Z_Operand_APT) - fatal("can't handle RPN simples other than APT and RSID"); + sv = newObject(type, (SV*) (av = newAV())); + if ((tmp = rpn2perl(c->s1)) == 0) + return 0; + av_push(av, tmp); + if ((tmp = rpn2perl(c->s2)) == 0) + return 0; + av_push(av, tmp); + return sv; + } + + case Z_RPNStructure_simple: switch (o->which) { + default: + fatal("unknown RPN simple type %d", (int) o->which); + + case Z_Operand_resultSetId: + /* This code causes a SIGBUS on my machine, and I have no + idea why. It seems as clear as day to me */ + rsid = (char*) o->u.resultSetId; + printf("Encoding resultSetId '%s'\n", rsid); + sv = newObject("Net::Z3950::RPN::RSID", (SV*) (hv = newHV())); + printf("Made sv=0x%lx, hv=0x%lx\n", + (unsigned long) sv ,(unsigned long) hv); + sv2 = newSVpv(rsid, strlen(rsid)); + setMember(hv, "id", sv2); + printf("Set hv{id} to 0x%lx\n", (unsigned long) sv2); + return sv; + + case Z_Operand_APT: at = o->u.attributesPlusTerm; if (at->term->which != Z_Term_general) fatal("can't handle RPN terms other than general"); - + sv = newObject("Net::Z3950::RPN::Term", (SV*) (hv = newHV())); if (at->attributes) { int i; @@ -466,30 +493,8 @@ static SV *rpn2perl(Z_RPNStructure *s) setMember(hv, "term", newSVpv((char*) at->term->u.general->buf, at->term->u.general->len)); return sv; - } - case Z_RPNStructure_complex: { - SV *tmp; - Z_Complex *c = s->u.complex; - char *type = 0; /* vacuous assignment satisfies gcc -Wall */ - switch (c->roperator->which) { - case Z_Operator_and: type = "Net::Z3950::RPN::And"; break; - case Z_Operator_or: type = "Net::Z3950::RPN::Or"; break; - case Z_Operator_and_not: type = "Net::Z3950::RPN::AndNot"; break; - case Z_Operator_prox: fatal("proximity not yet supported"); - default: fatal("unknown RPN operator %d", (int) c->roperator->which); - } - sv = newObject(type, (SV*) (av = newAV())); - if ((tmp = rpn2perl(c->s1)) == 0) - return 0; - av_push(av, tmp); - if ((tmp = rpn2perl(c->s2)) == 0) - return 0; - av_push(av, tmp); - return sv; - } - default: fatal("unknown RPN node type %d", (int) s->which); - } - + } } + return 0; }