/* 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; }