Skip to content

Commit b8721a6

Browse files
committed
[C-Curl] Client generator does not handle float properly (#21092)
- Convert float, double and long to string - Generate samples
1 parent e2f4b2f commit b8721a6

14 files changed

Lines changed: 344 additions & 2 deletions

File tree

modules/openapi-generator/src/main/resources/C-libcurl/api-body.mustache

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
#include <stdlib.h>
22
#include <stdio.h>
33
#include <ctype.h>
4+
45
#include "{{classname}}.h"
56

67
#define MAX_NUMBER_LENGTH 16
78
#define MAX_BUFFER_LENGTH 4096
9+
#define MAX_NUMBER_LENGTH_FLOAT 32
10+
#define MAX_NUMBER_LENGTH_LONG 21
811

912
{{#operations}}
1013
{{#operation}}
@@ -229,10 +232,16 @@ end:
229232
// query parameters
230233
{{^isArray}}
231234
char *keyQuery_{{{paramName}}} = NULL;
232-
{{#isPrimitiveType}}{{#isNumber}}{{{dataType}}}{{/isNumber}}{{#isLong}}{{{dataType}}}{{/isLong}}{{#isInteger}}char *{{/isInteger}}{{#isDouble}}{{{dataType}}}{{/isDouble}}{{#isFloat}}{{{dataType}}}{{/isFloat}}{{#isBoolean}}char *{{/isBoolean}}{{#isEnum}}{{#isString}}{{projectName}}_{{operationId}}_{{baseName}}_e{{/isString}}{{/isEnum}}{{^isEnum}}{{#isString}}{{{dataType}}} *{{/isString}}{{/isEnum}}{{#isByteArray}}{{{dataType}}} *{{/isByteArray}}{{#isDate}}{{{dataType}}}{{/isDate}}{{#isDateTime}}{{{dataType}}}{{/isDateTime}}{{#isFile}}{{{dataType}}}{{/isFile}}{{/isPrimitiveType}}{{^isPrimitiveType}}{{#isModel}}{{#isEnum}}{{datatypeWithEnum}}_e{{/isEnum}}{{^isEnum}}{{{dataType}}}_t *{{/isEnum}}{{/isModel}}{{^isModel}}{{#isEnum}}{{datatypeWithEnum}}_e{{/isEnum}}{{/isModel}}{{#isUuid}}{{dataType}} *{{/isUuid}}{{#isEmail}}{{dataType}}{{/isEmail}}{{/isPrimitiveType}} valueQuery_{{{paramName}}} {{#isString}}{{^isEnum}}= NULL{{/isEnum}}{{/isString}}{{#isInteger}}= NULL{{/isInteger}}{{#isBoolean}}= NULL{{/isBoolean}};
235+
{{#isPrimitiveType}}{{#isNumber}}{{{dataType}}}{{/isNumber}}{{#isLong}}char *{{/isLong}}{{#isInteger}}char *{{/isInteger}}{{#isDouble}}char *{{/isDouble}}{{#isFloat}}char *{{/isFloat}}{{#isBoolean}}char *{{/isBoolean}}{{#isEnum}}{{#isString}}{{projectName}}_{{operationId}}_{{baseName}}_e{{/isString}}{{/isEnum}}{{^isEnum}}{{#isString}}{{{dataType}}} *{{/isString}}{{/isEnum}}{{#isByteArray}}{{{dataType}}} *{{/isByteArray}}{{#isDate}}{{{dataType}}}{{/isDate}}{{#isDateTime}}{{{dataType}}}{{/isDateTime}}{{#isFile}}{{{dataType}}}{{/isFile}}{{/isPrimitiveType}}{{^isPrimitiveType}}{{#isModel}}{{#isEnum}}{{datatypeWithEnum}}_e{{/isEnum}}{{^isEnum}}{{{dataType}}}_t *{{/isEnum}}{{/isModel}}{{^isModel}}{{#isEnum}}{{datatypeWithEnum}}_e{{/isEnum}}{{/isModel}}{{#isUuid}}{{dataType}} *{{/isUuid}}{{#isEmail}}{{dataType}}{{/isEmail}}{{/isPrimitiveType}} valueQuery_{{{paramName}}} {{#isString}}{{^isEnum}}= NULL{{/isEnum}}{{/isString}}{{#isInteger}}= NULL{{/isInteger}}{{#isBoolean}}= NULL{{/isBoolean}};
233236
keyValuePair_t *keyPairQuery_{{paramName}} = 0;
234237
{{/isArray}}
238+
{{^isLong}}
239+
{{^isFloat}}
240+
{{^isDouble}}
235241
if ({{paramName}})
242+
{{/isDouble}}
243+
{{/isFloat}}
244+
{{/isLong}}
236245
{
237246
{{#isArray}}
238247
list_addElement(localVarQueryParameters,{{paramName}});
@@ -243,17 +252,35 @@ end:
243252
valueQuery_{{{paramName}}} = calloc(1,MAX_NUMBER_LENGTH);
244253
snprintf(valueQuery_{{{paramName}}}, MAX_NUMBER_LENGTH, "%d", *{{{paramName}}});
245254
{{/isInteger}}
255+
{{#isFloat}}
256+
valueQuery_{{{paramName}}} = calloc(1,MAX_NUMBER_LENGTH_FLOAT);
257+
snprintf(valueQuery_{{{paramName}}}, MAX_NUMBER_LENGTH_FLOAT, "%f", {{{paramName}}});
258+
{{/isFloat}}
259+
{{#isDouble}}
260+
valueQuery_{{{paramName}}} = calloc(1,MAX_NUMBER_LENGTH_FLOAT);
261+
snprintf(valueQuery_{{{paramName}}}, MAX_NUMBER_LENGTH_FLOAT, "%f", {{{paramName}}});
262+
{{/isDouble}}
263+
{{#isLong}}
264+
valueQuery_{{{paramName}}} = calloc(1,MAX_NUMBER_LENGTH_LONG);
265+
snprintf(valueQuery_{{{paramName}}}, MAX_NUMBER_LENGTH_LONG, "%d", {{{paramName}}});
266+
{{/isLong}}
246267
{{#isBoolean}}
247268
valueQuery_{{{paramName}}} = calloc(1,MAX_NUMBER_LENGTH);
248269
snprintf(valueQuery_{{{paramName}}}, MAX_NUMBER_LENGTH, "%d", *{{{paramName}}});
249270
{{/isBoolean}}
250271
{{^isInteger}}
251272
{{^isBoolean}}
273+
{{^isFloat}}
274+
{{^isDouble}}
275+
{{^isLong}}
252276
valueQuery_{{{paramName}}} = {{#isString}}{{^isEnum}}strdup({{/isEnum}}{{/isString}}({{{paramName}}}){{#isString}}{{^isEnum}}){{/isEnum}}{{/isString}};
277+
{{/isLong}}
278+
{{/isDouble}}
279+
{{/isFloat}}
253280
{{/isBoolean}}
254281
{{/isInteger}}
255282
keyPairQuery_{{paramName}} = keyValuePair_create(keyQuery_{{{paramName}}}, {{#isEnum}}strdup({{{operationId}}}_{{enumName}}_ToString(
256-
{{/isEnum}}{{^isString}}{{^isInteger}}{{^isBoolean}}&{{/isBoolean}}{{/isInteger}}{{/isString}}valueQuery_{{{paramName}}}{{#isEnum}})){{/isEnum}});
283+
{{/isEnum}}{{^isString}}{{^isInteger}}{{^isFloat}}{{^isDouble}}{{^isLong}}{{^isBoolean}}&{{/isBoolean}}{{/isLong}}{{/isDouble}}{{/isFloat}}{{/isInteger}}{{/isString}}valueQuery_{{{paramName}}}{{#isEnum}})){{/isEnum}});
257284
list_addElement(localVarQueryParameters,keyPairQuery_{{paramName}});
258285
{{/isArray}}
259286
}

samples/client/others/c/bearerAuth/api/DefaultAPI.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
#include <stdlib.h>
22
#include <stdio.h>
33
#include <ctype.h>
4+
45
#include "DefaultAPI.h"
56

67
#define MAX_NUMBER_LENGTH 16
78
#define MAX_BUFFER_LENGTH 4096
9+
#define MAX_NUMBER_LENGTH_FLOAT 32
10+
#define MAX_NUMBER_LENGTH_LONG 21
811

912

1013
// Returns private information.

samples/client/petstore/c-useJsonUnformatted/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ Category | Method | HTTP request | Description
9292
*UserAPI* | [**UserAPI_getUserByName**](docs/UserAPI.md#UserAPI_getUserByName) | **GET** /user/{username} | Get user by user name
9393
*UserAPI* | [**UserAPI_loginUser**](docs/UserAPI.md#UserAPI_loginUser) | **GET** /user/login | Logs user into the system
9494
*UserAPI* | [**UserAPI_logoutUser**](docs/UserAPI.md#UserAPI_logoutUser) | **GET** /user/logout | Logs out current logged in user session
95+
*UserAPI* | [**UserAPI_testInt32Int64FloatDouble**](docs/UserAPI.md#UserAPI_testInt32Int64FloatDouble) | **GET** /user/test_int32_int64_float_double | test int32, int64 float and double query parameters in API
9596
*UserAPI* | [**UserAPI_testIntAndBool**](docs/UserAPI.md#UserAPI_testIntAndBool) | **GET** /user/testIntAndBool | test integer and boolean query parameters in API
9697
*UserAPI* | [**UserAPI_updateUser**](docs/UserAPI.md#UserAPI_updateUser) | **PUT** /user/{username} | Updated user
9798

samples/client/petstore/c-useJsonUnformatted/api/PetAPI.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
#include <stdlib.h>
22
#include <stdio.h>
33
#include <ctype.h>
4+
45
#include "PetAPI.h"
56

67
#define MAX_NUMBER_LENGTH 16
78
#define MAX_BUFFER_LENGTH 4096
9+
#define MAX_NUMBER_LENGTH_FLOAT 32
10+
#define MAX_NUMBER_LENGTH_LONG 21
811

912
// Functions for enum STATUS for PetAPI_findPetsByStatus
1013

samples/client/petstore/c-useJsonUnformatted/api/StoreAPI.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
#include <stdlib.h>
22
#include <stdio.h>
33
#include <ctype.h>
4+
45
#include "StoreAPI.h"
56

67
#define MAX_NUMBER_LENGTH 16
78
#define MAX_BUFFER_LENGTH 4096
9+
#define MAX_NUMBER_LENGTH_FLOAT 32
10+
#define MAX_NUMBER_LENGTH_LONG 21
811

912
// Functions for enum RATING for StoreAPI_sendRating
1013

samples/client/petstore/c-useJsonUnformatted/api/UserAPI.c

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
#include <stdlib.h>
22
#include <stdio.h>
33
#include <ctype.h>
4+
45
#include "UserAPI.h"
56

67
#define MAX_NUMBER_LENGTH 16
78
#define MAX_BUFFER_LENGTH 4096
9+
#define MAX_NUMBER_LENGTH_FLOAT 32
10+
#define MAX_NUMBER_LENGTH_LONG 21
811

912

1013
// Create user
@@ -594,6 +597,110 @@ UserAPI_logoutUser(apiClient_t *apiClient)
594597

595598

596599

600+
free(localVarPath);
601+
602+
}
603+
604+
// test int32, int64 float and double query parameters in API
605+
//
606+
// This can test int32, int64 float and double query parameters in API.
607+
//
608+
void
609+
UserAPI_testInt32Int64FloatDouble(apiClient_t *apiClient, float floatnum, double doublenum, int *int32num, long int64num)
610+
{
611+
list_t *localVarQueryParameters = list_createList();
612+
list_t *localVarHeaderParameters = NULL;
613+
list_t *localVarFormParameters = NULL;
614+
list_t *localVarHeaderType = NULL;
615+
list_t *localVarContentType = NULL;
616+
char *localVarBodyParameters = NULL;
617+
size_t localVarBodyLength = 0;
618+
619+
// clear the error code from the previous api call
620+
apiClient->response_code = 0;
621+
622+
// create the path
623+
char *localVarPath = strdup("/user/test_int32_int64_float_double");
624+
625+
626+
627+
628+
629+
// query parameters
630+
char *keyQuery_floatnum = NULL;
631+
char * valueQuery_floatnum ;
632+
keyValuePair_t *keyPairQuery_floatnum = 0;
633+
{
634+
keyQuery_floatnum = strdup("floatnum");
635+
valueQuery_floatnum = calloc(1,MAX_NUMBER_LENGTH_FLOAT);
636+
snprintf(valueQuery_floatnum, MAX_NUMBER_LENGTH_FLOAT, "%f", floatnum);
637+
keyPairQuery_floatnum = keyValuePair_create(keyQuery_floatnum, valueQuery_floatnum);
638+
list_addElement(localVarQueryParameters,keyPairQuery_floatnum);
639+
}
640+
641+
// query parameters
642+
char *keyQuery_doublenum = NULL;
643+
char * valueQuery_doublenum ;
644+
keyValuePair_t *keyPairQuery_doublenum = 0;
645+
{
646+
keyQuery_doublenum = strdup("doublenum");
647+
valueQuery_doublenum = calloc(1,MAX_NUMBER_LENGTH_FLOAT);
648+
snprintf(valueQuery_doublenum, MAX_NUMBER_LENGTH_FLOAT, "%f", doublenum);
649+
keyPairQuery_doublenum = keyValuePair_create(keyQuery_doublenum, valueQuery_doublenum);
650+
list_addElement(localVarQueryParameters,keyPairQuery_doublenum);
651+
}
652+
653+
// query parameters
654+
char *keyQuery_int32num = NULL;
655+
char * valueQuery_int32num = NULL;
656+
keyValuePair_t *keyPairQuery_int32num = 0;
657+
if (int32num)
658+
{
659+
keyQuery_int32num = strdup("int32num");
660+
valueQuery_int32num = calloc(1,MAX_NUMBER_LENGTH);
661+
snprintf(valueQuery_int32num, MAX_NUMBER_LENGTH, "%d", *int32num);
662+
keyPairQuery_int32num = keyValuePair_create(keyQuery_int32num, valueQuery_int32num);
663+
list_addElement(localVarQueryParameters,keyPairQuery_int32num);
664+
}
665+
666+
// query parameters
667+
char *keyQuery_int64num = NULL;
668+
char * valueQuery_int64num ;
669+
keyValuePair_t *keyPairQuery_int64num = 0;
670+
{
671+
keyQuery_int64num = strdup("int64num");
672+
valueQuery_int64num = calloc(1,MAX_NUMBER_LENGTH_LONG);
673+
snprintf(valueQuery_int64num, MAX_NUMBER_LENGTH_LONG, "%d", int64num);
674+
keyPairQuery_int64num = keyValuePair_create(keyQuery_int64num, valueQuery_int64num);
675+
list_addElement(localVarQueryParameters,keyPairQuery_int64num);
676+
}
677+
apiClient_invoke(apiClient,
678+
localVarPath,
679+
localVarQueryParameters,
680+
localVarHeaderParameters,
681+
localVarFormParameters,
682+
localVarHeaderType,
683+
localVarContentType,
684+
localVarBodyParameters,
685+
localVarBodyLength,
686+
"GET");
687+
688+
// uncomment below to debug the error response
689+
//if (apiClient->response_code == 200) {
690+
// printf("%s\n","successful operation");
691+
//}
692+
//No return type
693+
end:
694+
if (apiClient->dataReceived) {
695+
free(apiClient->dataReceived);
696+
apiClient->dataReceived = NULL;
697+
apiClient->dataReceivedLen = 0;
698+
}
699+
list_freeList(localVarQueryParameters);
700+
701+
702+
703+
597704
free(localVarPath);
598705

599706
}

samples/client/petstore/c-useJsonUnformatted/api/UserAPI.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,14 @@ void
5454
UserAPI_logoutUser(apiClient_t *apiClient);
5555

5656

57+
// test int32, int64 float and double query parameters in API
58+
//
59+
// This can test int32, int64 float and double query parameters in API.
60+
//
61+
void
62+
UserAPI_testInt32Int64FloatDouble(apiClient_t *apiClient, float floatnum, double doublenum, int *int32num, long int64num);
63+
64+
5765
// test integer and boolean query parameters in API
5866
//
5967
// This can test integer and boolean query parameters in API.

samples/client/petstore/c-useJsonUnformatted/docs/UserAPI.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ Method | HTTP request | Description
1111
[**UserAPI_getUserByName**](UserAPI.md#UserAPI_getUserByName) | **GET** /user/{username} | Get user by user name
1212
[**UserAPI_loginUser**](UserAPI.md#UserAPI_loginUser) | **GET** /user/login | Logs user into the system
1313
[**UserAPI_logoutUser**](UserAPI.md#UserAPI_logoutUser) | **GET** /user/logout | Logs out current logged in user session
14+
[**UserAPI_testInt32Int64FloatDouble**](UserAPI.md#UserAPI_testInt32Int64FloatDouble) | **GET** /user/test_int32_int64_float_double | test int32, int64 float and double query parameters in API
1415
[**UserAPI_testIntAndBool**](UserAPI.md#UserAPI_testIntAndBool) | **GET** /user/testIntAndBool | test integer and boolean query parameters in API
1516
[**UserAPI_updateUser**](UserAPI.md#UserAPI_updateUser) | **PUT** /user/{username} | Updated user
1617

@@ -218,6 +219,39 @@ No authorization required
218219
219220
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
220221
222+
# **UserAPI_testInt32Int64FloatDouble**
223+
```c
224+
// test int32, int64 float and double query parameters in API
225+
//
226+
// This can test int32, int64 float and double query parameters in API.
227+
//
228+
void UserAPI_testInt32Int64FloatDouble(apiClient_t *apiClient, float floatnum, double doublenum, int *int32num, long int64num);
229+
```
230+
231+
### Parameters
232+
Name | Type | Description | Notes
233+
------------- | ------------- | ------------- | -------------
234+
**apiClient** | **apiClient_t \*** | context containing the client configuration |
235+
**floatnum** | **float** | A float number | [optional]
236+
**doublenum** | **double** | A double number | [optional]
237+
**int32num** | **int \*** | An int32 number | [optional]
238+
**int64num** | **long** | An int64 number | [optional]
239+
240+
### Return type
241+
242+
void
243+
244+
### Authorization
245+
246+
No authorization required
247+
248+
### HTTP request headers
249+
250+
- **Content-Type**: Not defined
251+
- **Accept**: Not defined
252+
253+
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
254+
221255
# **UserAPI_testIntAndBool**
222256
```c
223257
// test integer and boolean query parameters in API

samples/client/petstore/c/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ Category | Method | HTTP request | Description
9292
*UserAPI* | [**UserAPI_getUserByName**](docs/UserAPI.md#UserAPI_getUserByName) | **GET** /user/{username} | Get user by user name
9393
*UserAPI* | [**UserAPI_loginUser**](docs/UserAPI.md#UserAPI_loginUser) | **GET** /user/login | Logs user into the system
9494
*UserAPI* | [**UserAPI_logoutUser**](docs/UserAPI.md#UserAPI_logoutUser) | **GET** /user/logout | Logs out current logged in user session
95+
*UserAPI* | [**UserAPI_testInt32Int64FloatDouble**](docs/UserAPI.md#UserAPI_testInt32Int64FloatDouble) | **GET** /user/test_int32_int64_float_double | test int32, int64 float and double query parameters in API
9596
*UserAPI* | [**UserAPI_testIntAndBool**](docs/UserAPI.md#UserAPI_testIntAndBool) | **GET** /user/testIntAndBool | test integer and boolean query parameters in API
9697
*UserAPI* | [**UserAPI_updateUser**](docs/UserAPI.md#UserAPI_updateUser) | **PUT** /user/{username} | Updated user
9798

samples/client/petstore/c/api/PetAPI.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
#include <stdlib.h>
22
#include <stdio.h>
33
#include <ctype.h>
4+
45
#include "PetAPI.h"
56

67
#define MAX_NUMBER_LENGTH 16
78
#define MAX_BUFFER_LENGTH 4096
9+
#define MAX_NUMBER_LENGTH_FLOAT 32
10+
#define MAX_NUMBER_LENGTH_LONG 21
811

912
// Functions for enum STATUS for PetAPI_findPetsByStatus
1013

0 commit comments

Comments
 (0)