William Cheng edc05df774
Add C client generator (#516)
* add c generator (1st commit)

* udpate c model template

* more fixes

* Add string replace function for C generator (#908)

* Add string replace function for C generator

* Fixed replacement for variable only

* Fixed problem for different datatypes of paramName

* store return value of modified path

* set str_replace variable to be same as original variable.

* [C] Fixed coding style issues

* add uncrustify support

* update petstore sampmles

* add Locale.ROOT

* added test-api-client.c to include test cases for strReplace function

* added header and body mustache and made changes to ClibcurlClientCodegen.java accordingly

* [C] renamed functions in apiKey.c.mustache according to apiKey.h.mustache

* [C] changes in import statement

* renamed apiKey.h to keyValuePair.h and made necessary changes in the codes

* changed apiKey.c according to keyValuePair.h

* fixed import statement in model

* added code for generating struct in model-header.mustache

* added typedef struct for model-headers

* updated sample/client/petstore/C

* fix locale

* [C] Function addition and modification of major structs (#1020)

* added readme file

* fixed parameters in api headers functions

* made changes to add readme file and typemapping of array to list

* fixed header import statement in apiheader files

* modified struct of model type in model header

* updated sample

* modified README file

* updated sample

* parse from json function added

* modified struct and create function

* added include for model

* modified parsefromjson function

* modified struct and create function for more datatypes

* added mapping for date-time and modified model import return statement

* modified function parameters

* modified include statement

* fix function in api body

* updated sample

* clean up files

* regenerate c petstore

* fix error message when setting uncrustify

* add version to uncrustify usage

* added uncrustify rules in  mustache (#1021)

* added uncrustify rules in  mustache

* updated sample

* updated same with crustify

* updated sample with uncrusitfy 0.67

* modified readme about uncrustify requirements

* fixed mistakes in readme mustache and sample readme

* fix file import, unformat c petstore

* fix import in test files

* fix model with complexType

* fix free string, format the code using uncrustify

* modified sample

* Modified sample to check

* return type issue figured,more to do to fix it

* minor fixes to make complete code compile

* Compiling sample code. Store has issue with map.

* comment out test file generation which is not req.

* commented operation name

* fixed various issues responsible for code not compiling

* test mustache temporary for testing

* updated sample add,del,getbyid works, formparam yet to do

* few minor changes and added fuction to add different header and content type in apiClient

* added code to upload image

* added function to test upload image

* fixes for fileupload and various other small things

* fixed issue due to xml produces

* updated sample:working sample add,del,find,uploading:tocheck ,

* added free functions for variable where memory is allocated

* rename imagecontainer struct to filestruct

* fix issues with if functions for all list types

* fixed issue with primitive return type in header file

* updated sample w/ free functions

* update c samples

* remove corrupted file

* update samples

* test cases for APIs

* added function to generate test cases from new mustache

* mustache files for manual written test cases

* added default content type to application/json

* fixed issue with primitive return type

* fixed issue with bool type

* added file apiKey.c

* updated sample tested

* update c environment variable (#1090)

* add mapping for map (#1103)

* minor update

* revert list paramter check to NULL

* modified return type for primitive(map - list_t)in mustache

* removed apiClient_free as it was two times

* updated sample

* fixed issue of path parameter when string less than parameter len

* fixed issue for form paramters upload

* added checks to avoid seg faults

* updated sample

* added check for null value in form parameter

* modified size of mallocs to dynamic

* updated sample

* Add C Petstore to Travis CI (#1136)

* setup CI for C petstore

* update bash script permission

* unit petapi test

* fixed memory leak in strReplace and apiClient Functions

* modified return value for status generation

* added enum defination and functions to convert and back from string

* added function for enum and made changes to free memory at necessary places

* added datatype handling for enum

* fixes regarding memory allocation and free

* updated mustache of test files

* updated sample

* renamed manually written test files

* manual test file for pet

* cleaned common api test file for time being

* renamed test files

* added renamed test files to build test bash

* added file null pointer check

* modified uncrusitfy rules

* minor update to c templates (#1161)

* [C] Fixed enum function declaration  (#1178)

* fixed enum function declaration in model headers

* fixed enum declaration in header files for sample

* disable curl verbose mode and add response code variable

* added response code variable in apiClient struct

* modified apiClient header and source file

* added response and removed commented code api-body mustache

* removed commented code from model-body mustache

* removed unnecessary print statements from test mustache

* updated sample

* fixed spaces issue

* Better format in C templates (#1224)

* better format in the c template

* minor format fix

* [C] changed base url from static to dynamic (#1225)

* changed basePath from static to dynamic

* removed unnecessary header declaration

* updated sample

* [C] added curl version check in CMakeList.txt (#1248)

* added curl version check in CMakeList.txt

* Updated README for latest curl version

* [C] Major changes to keyValuePair function (#1282)

* removed static declaration

* changed static declaration

* added difference for string and non string

* added more code for different function for string and non string

* fix issue with param name

* change value in keyPairValue to void

* fixed issue of difference in function name cases

* added support for non char parameters in api

* fix issue of map return data

* modified manual-StoreAPI map return data handling

* fix minor mistake

* added support for map and changed code to support value of keyvaluepair as char and other

* updated sample

* fixed api header declarations

* change map declaration in header

* resolved issues realted to map data handling

* fix minor issues

* add N at start if enum variable starts with number

* override toParamName method

* changed paramters to paramName from baseName

* change variables in apibody from baseName to paramName

* Skip test file generation (#1459)

* skip test file generation

* skip overwriting CMakeLists.txt
2018-11-17 01:32:18 +08:00

230 lines
5.1 KiB
C

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "cJSON.h"
#include "list.h"
#include "keyValuePair.h"
#include "pet.h"
#include "category.h"
#include "list.h"
#include "tag.h"
char *statuspet_ToString(status_e status) {
char *statusArray[] = { "available", "pending", "sold" };
return statusArray[status];
}
status_e statuspet_FromString(char *status) {
int stringToReturn = 0;
char *statusArray[] = { "available", "pending", "sold" };
size_t sizeofArray = sizeof(statusArray) / sizeof(statusArray[0]);
while(stringToReturn < sizeofArray) {
if(strcmp(status, statusArray[stringToReturn]) == 0) {
return stringToReturn;
}
stringToReturn++;
}
}
pet_t *pet_create(long id, category_t *category, char *name, list_t *photoUrls,
list_t *tags, status_e status) {
pet_t *pet = malloc(sizeof(pet_t));
pet->id = id;
pet->category = category;
pet->name = name;
pet->photoUrls = photoUrls;
pet->tags = tags;
pet->status = status;
return pet;
}
void pet_free(pet_t *pet) {
listEntry_t *listEntry;
category_free(pet->category);
free(pet->name);
list_ForEach(listEntry, pet->photoUrls) {
free(listEntry->data);
}
list_free(pet->photoUrls);
list_ForEach(listEntry, pet->tags) {
tag_free(listEntry->data);
}
list_free(pet->tags);
free(pet);
}
cJSON *pet_convertToJSON(pet_t *pet) {
cJSON *item = cJSON_CreateObject();
// pet->id
if(cJSON_AddNumberToObject(item, "id", pet->id) == NULL) {
goto fail; // Numeric
}
// pet->category
cJSON *category = category_convertToJSON(pet->category);
if(category == NULL) {
goto fail; // nonprimitive
}
cJSON_AddItemToObject(item, "category", category);
if(item->child == NULL) {
goto fail;
}
// pet->name
if(cJSON_AddStringToObject(item, "name", pet->name) == NULL) {
goto fail; // String
}
// pet->photoUrls
cJSON *photo_urls = cJSON_AddArrayToObject(item, "photoUrls");
if(photo_urls == NULL) {
goto fail; // primitive container
}
listEntry_t *photo_urlsListEntry;
list_ForEach(photo_urlsListEntry, pet->photoUrls) {
if(cJSON_AddStringToObject(photo_urls, "",
(char *) photo_urlsListEntry->data)
== NULL)
{
goto fail;
}
}
// pet->tags
cJSON *tags = cJSON_AddArrayToObject(item, "tags");
if(tags == NULL) {
goto fail; // nonprimitive container
}
listEntry_t *tagsListEntry;
list_ForEach(tagsListEntry, pet->tags) {
cJSON *item = tag_convertToJSON(tagsListEntry->data);
if(item == NULL) {
goto fail;
}
cJSON_AddItemToArray(tags, item);
}
// pet->status
if(cJSON_AddStringToObject(item, "status",
statuspet_ToString(pet->status)) == NULL)
{
goto fail; // String
}
return item;
fail:
cJSON_Delete(item);
return NULL;
}
pet_t *pet_parseFromJSON(char *jsonString) {
pet_t *pet = NULL;
cJSON *petJSON = cJSON_Parse(jsonString);
if(petJSON == NULL) {
const char *error_ptr = cJSON_GetErrorPtr();
if(error_ptr != NULL) {
fprintf(stderr, "Error Before: %s\n", error_ptr);
goto end;
}
}
// pet->id
cJSON *id = cJSON_GetObjectItemCaseSensitive(petJSON, "id");
if(!cJSON_IsNumber(id)) {
goto end; // Numeric
}
// pet->category
category_t *category;
cJSON *categoryJSON = cJSON_GetObjectItemCaseSensitive(petJSON,
"category");
if(petJSON == NULL) {
const char *error_ptr = cJSON_GetErrorPtr();
if(error_ptr != NULL) {
fprintf(stderr, "Error Before: %s\n", error_ptr);
}
goto end; // nonprimitive
}
char *categoryJSONData = cJSON_Print(categoryJSON);
category = category_parseFromJSON(categoryJSONData);
// pet->name
cJSON *name = cJSON_GetObjectItemCaseSensitive(petJSON, "name");
if(!cJSON_IsString(name) ||
(name->valuestring == NULL))
{
goto end; // String
}
// pet->photoUrls
cJSON *photo_urls;
cJSON *photoUrlsJSON = cJSON_GetObjectItemCaseSensitive(petJSON,
"photoUrls");
if(!cJSON_IsArray(photoUrlsJSON)) {
goto end; // primitive container
}
list_t *photo_urlsList = list_create();
cJSON_ArrayForEach(photo_urls, photoUrlsJSON)
{
if(!cJSON_IsString(photo_urls)) {
goto end;
}
list_addElement(photo_urlsList,
strdup(photo_urls->valuestring));
}
// pet->tags
cJSON *tags;
cJSON *tagsJSON = cJSON_GetObjectItemCaseSensitive(petJSON, "tags");
if(!cJSON_IsArray(tagsJSON)) {
goto end; // nonprimitive container
}
list_t *tagsList = list_create();
cJSON_ArrayForEach(tags, tagsJSON)
{
if(!cJSON_IsObject(tags)) {
goto end;
}
char *JSONData = cJSON_Print(tags);
tag_t *tagsItem = tag_parseFromJSON(JSONData);
list_addElement(tagsList, tagsItem);
free(JSONData);
}
// pet->status
status_e statusVariable;
cJSON *status = cJSON_GetObjectItemCaseSensitive(petJSON, "status");
if(!cJSON_IsString(status) ||
(status->valuestring == NULL))
{
goto end; // String
}
statusVariable = statuspet_FromString(status->valuestring);
pet = pet_create(
id->valuedouble,
category,
strdup(name->valuestring),
photo_urlsList,
tagsList,
statusVariable
);
free(categoryJSONData);
cJSON_Delete(petJSON);
return pet;
end:
cJSON_Delete(petJSON);
return NULL;
}