// Description: SpellChecker API usage example.
// Copyright: (C) 2015 EffectiveSoft Ltd. All Rights Reserved.
// Technical support: technical-support@effective-soft.com
// This example requires the libcurl and jsoncpp libraries.

#include <iostream>
#include "curl/curl.h"
#include "json/json.h"

using namespace std;

// libcurl write callback function
static int writer(char *data, size_t size, size_t nmemb,
				  std::string *writerData)
	if (writerData == NULL)
		return 0;
	writerData->append(data, size*nmemb);
	return size * nmemb;

int main(int argc, char* argv[])
	CURL *curl = NULL;
	CURLcode res;

	// sample text
	char pszText[] = "EuropeanUnion leaders need to be bolder in how they tackle the eurozone crisis, reduce budget deficets and encourage growt, Prime Minister David Cameron said today.";
	// returned data from Intellexer API
	std::string results;
	// libcurl connection initialization
	curl = curl_easy_init();
	if (curl == NULL)
		std::cerr << "Failed to create CURL connection\n";
		return EXIT_FAILURE;
	struct curl_slist *headerlist = NULL;
		// set the URL with parameters for POST request and specify API key for authorization purposes (change YourAPIKey to the Intellexer API key)
		curl_easy_setopt(curl, CURLOPT_URL, "http://api.intellexer.com/checkTextSpelling?apikey=YourAPIKey&language=ENGLISH&errorTune=2&errorBound=3&minProbabilityTune=2&minProbabilityWeight=30");
		// set option to the callback function
		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
		// set option for writing received data
		curl_easy_setopt(curl, CURLOPT_WRITEDATA, &results);
		// specify the POST data
		headerlist = curl_slist_append(headerlist, "Content-Type: application/octet-stream");
		curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
		curl_easy_setopt(curl, CURLOPT_POSTFIELDS, pszText);
		// perform the request
		res = curl_easy_perform(curl);
		// error checking
		if(res != CURLE_OK)
			std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << "\n";
			// parse JSON results
			Json::Value root;
			Json::Reader reader;
			bool isSuccess = reader.parse(results,	root, false);
			if (isSuccess)
				// print source and processed sentences
				Json::Value src_sent =  root["sourceSentences"];
				Json::Value proc_sent =  root["processedSentences"];
				for(unsigned int i = 0; i < src_sent.size(); ++i) 
					std::cout << "Source:\t" << src_sent[i].asString() << "\n";
					std::cout << "Corrected:\t" << proc_sent[i].asString() << "\n";
				// print list of corrections
				std::cout << "\nList of corrections:\n";
				Json::Value corrections =  root["corrections"];
				for(unsigned int j = 0; j < corrections.size(); ++j) 
					std::cout << "\t" << corrections[j]["v"][0]["t"].asString() << "\n";

				std::cerr << "JSON parsing error\n";
				return EXIT_FAILURE;
	//global cleanup
	return 0;


Source:	EuropeanUnion leaders need to be bolder in how they tackle the eurozone crisis , reduce budget deficets and encourage growt , Prime Minister David Cameron said today . 
Corrected:	European Union leaders need to be bolder in how they tackle the eurozone crisis, reduce budget deficits and encourage growth, Prime Minister David Cameron said today.

List of corrections:
	European Union