/*
calccgi.c
Example calculator service in C
Compilation in C (see samples/calc/calc.h):
$ wsdl2h -c -o calc.h http://www.genivia.com/calc.wsdl
$ soapcpp2 -SL calc.h
$ cc -o calc.cgi calccgi.c stdsoap2.c soapC.c soapServer.c
where stdsoap2.c is in the 'gsoap' directory, or use libgsoap:
$ cc -o calc.cgi calccgi.c soapC.c soapServer.c -lgsoap
--------------------------------------------------------------------------------
gSOAP XML Web services tools
Copyright (C) 2001-2017, Robert van Engelen, Genivia, Inc. All Rights Reserved.
This software is released under one of the following two licenses:
GPL or Genivia's license for commercial use.
--------------------------------------------------------------------------------
GPL license.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA
Author contact information:
engelen@genivia.com / engelen@acm.org
--------------------------------------------------------------------------------
A commercial use license is available from Genivia, Inc., contact@genivia.com
--------------------------------------------------------------------------------
*/
#include "soapH.h"
#include "calc.nsmap"
int main(int argc, char **argv)
{
struct soap soap;
soap_init1(&soap, SOAP_XML_INDENT);
soap_serve(&soap); /* serve as CGI application */
soap_destroy(&soap);
soap_end(&soap);
soap_done(&soap);
return 0;
}
int ns2__add(struct soap *soap, double a, double b, double *result)
{
(void)soap;
*result = a + b;
return SOAP_OK;
}
int ns2__sub(struct soap *soap, double a, double b, double *result)
{
(void)soap;
*result = a - b;
return SOAP_OK;
}
int ns2__mul(struct soap *soap, double a, double b, double *result)
{
(void)soap;
*result = a * b;
return SOAP_OK;
}
int ns2__div(struct soap *soap, double a, double b, double *result)
{
if (b)
*result = a / b;
else
{
char *s = (char*)soap_malloc(soap, 1024);
(SOAP_SNPRINTF(s, 1024, 100), "Can't divide %f by %f", a, b);
return soap_sender_fault(soap, "Division by zero", s);
}
return SOAP_OK;
}
int ns2__pow(struct soap *soap, double a, double b, double *result)
{
*result = pow(a, b);
if (soap_errno == EDOM) /* soap_errno is like errno, but compatible with Win32 */
{ char *s = (char*)soap_malloc(soap, 1024);
(SOAP_SNPRINTF(s, 1024, 100), "Can't raise %f to %f", a, b);
return soap_sender_fault(soap, "Power function domain error", s);
}
return SOAP_OK;
}