Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: uamqp/deps/umock-c/src/umockautoignoreargs.c
- Revision:
- 0:f7f1f0d76dd6
diff -r 000000000000 -r f7f1f0d76dd6 uamqp/deps/umock-c/src/umockautoignoreargs.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uamqp/deps/umock-c/src/umockautoignoreargs.c Thu Aug 23 06:52:14 2018 +0000
@@ -0,0 +1,184 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+#include <stddef.h>
+#include <string.h>
+#include <ctype.h>
+#include "umockalloc.h"
+#include "umockautoignoreargs.h"
+#include "umock_log.h"
+
+static const char ignore_ptr_arg_string[] = "IGNORED_PTR_ARG";
+static const char ignore_num_arg_string[] = "IGNORED_NUM_ARG";
+
+#define PARSER_STACK_DEPTH 256
+
+/* Codes_SRS_UMOCKAUTOIGNOREARGS_01_001: [ `umockautoignoreargs_is_call_argument_ignored` shall determine whether argument `argument_index` shall be ignored or not. ]*/
+int umockautoignoreargs_is_call_argument_ignored(const char* call, size_t argument_index, int* is_argument_ignored)
+{
+ int result;
+
+ if ((call == NULL) ||
+ (is_argument_ignored == NULL))
+ {
+ /* Codes_SRS_UMOCKAUTOIGNOREARGS_01_002: [ If `call` or `is_argument_ignored` is NULL, `umockautoignoreargs_is_call_argument_ignored` shall fail and return a non-zero value. ]*/
+ result = __LINE__;
+ }
+ else
+ {
+ const char* cur_pos = strchr(call, '(');
+
+ if (cur_pos == NULL)
+ {
+ /* Codes_SRS_UMOCKAUTOIGNOREARGS_01_004: [ If `umockautoignoreargs_is_call_argument_ignored` fails parsing the `call` argument it shall fail and return a non-zero value. ]*/
+ result = __LINE__;
+ }
+ else
+ {
+ size_t argument_count = 1;
+ unsigned char argument_found = 0;
+
+ /* Codes_SRS_UMOCKAUTOIGNOREARGS_01_009: [ If the number of arguments parsed from `call` is less than `argument_index`, `umockautoignoreargs_is_call_argument_ignored` shall fail and return a non-zero value. ]*/
+ cur_pos++;
+
+ while (*cur_pos != '\0')
+ {
+ /* clear out all spaces */
+ while ((*cur_pos != '\0') && isspace(*cur_pos))
+ {
+ cur_pos++;
+ }
+
+ if (*cur_pos != '\0')
+ {
+ if (*cur_pos == ')')
+ {
+ /* no more args and we did not get to the arg we wanted */
+ /* Codes_SRS_UMOCKAUTOIGNOREARGS_01_009: [ If the number of arguments parsed from `call` is less than `argument_index`, `umockautoignoreargs_is_call_argument_ignored` shall fail and return a non-zero value. ]*/
+ result = __LINE__;
+ break;
+ }
+ else
+ {
+ if (argument_count == argument_index)
+ {
+ /* Codes_SRS_UMOCKAUTOIGNOREARGS_01_006: [ If the argument value is `IGNORED_PTR_ARG` then `is_argument_ignored` shall be set to 1. ]*/
+ if ((strncmp(cur_pos, ignore_ptr_arg_string, sizeof(ignore_ptr_arg_string) - 1) == 0) ||
+ /* Codes_SRS_UMOCKAUTOIGNOREARGS_01_007: [ If the argument value is `IGNORED_NUM_ARG` then `is_argument_ignored` shall be set to 1. ]*/
+ (strncmp(cur_pos, ignore_num_arg_string, sizeof(ignore_num_arg_string) - 1) == 0))
+ {
+ /* Codes_SRS_UMOCKAUTOIGNOREARGS_01_005: [ If `umockautoignoreargs_is_call_argument_ignored` was able to parse the `argument_index`th argument it shall succeed and return 0, while writing whether the argument is ignored in the `is_argument_ignored` output argument. ]*/
+ *is_argument_ignored = 1;
+ }
+ else
+ {
+ /* Codes_SRS_UMOCKAUTOIGNOREARGS_01_008: [ If the argument value is any other value then `is_argument_ignored` shall be set to 0. ]*/
+ /* Codes_SRS_UMOCKAUTOIGNOREARGS_01_005: [ If `umockautoignoreargs_is_call_argument_ignored` was able to parse the `argument_index`th argument it shall succeed and return 0, while writing whether the argument is ignored in the `is_argument_ignored` output argument. ]*/
+ *is_argument_ignored = 0;
+ }
+
+ argument_found = 1;
+ break;
+ }
+ else
+ {
+ unsigned char parser_stack[PARSER_STACK_DEPTH];
+ size_t parser_stack_index = 0;
+ int parse_error = 0;
+
+ /* Codes_SRS_UMOCKAUTOIGNOREARGS_01_003: [ `umockautoignoreargs_is_call_argument_ignored` shall parse the `call` string as a function call: function_name(arg1, arg2, ...). ]*/
+ while ((*cur_pos != '\0') &&
+ ((*cur_pos != ',') || (parser_stack_index > 0)))
+ {
+ if (*cur_pos == '(')
+ {
+ if (parser_stack_index == PARSER_STACK_DEPTH)
+ {
+ /* error*/
+ parse_error = 1;
+ break;
+ }
+ else
+ {
+ parser_stack[parser_stack_index] = 1;
+ parser_stack_index++;
+ }
+ }
+ if (*cur_pos == ')')
+ {
+ if (parser_stack_index == 0)
+ {
+ /* error*/
+ parse_error = 1;
+ break;
+ }
+ else
+ {
+ if (parser_stack[parser_stack_index - 1] == 1)
+ {
+ parser_stack_index--;
+ }
+ }
+ }
+ if (*cur_pos == '{')
+ {
+ if (parser_stack_index == PARSER_STACK_DEPTH)
+ {
+ /* error*/
+ parse_error = 1;
+ break;
+ }
+ else
+ {
+ parser_stack[parser_stack_index] = 2;
+ parser_stack_index++;
+ }
+ }
+ if (*cur_pos == '}')
+ {
+ if (parser_stack_index == 0)
+ {
+ /* error*/
+ parse_error = 1;
+ break;
+ }
+ else
+ {
+ if (parser_stack[parser_stack_index - 1] == 2)
+ {
+ parser_stack_index--;
+ }
+ }
+ }
+
+ cur_pos++;
+ }
+
+ if ((*cur_pos == '\0') ||
+ parse_error)
+ {
+ break;
+ }
+ else
+ {
+ argument_count++;
+ cur_pos++;
+ }
+ }
+ }
+ }
+ }
+
+ if (argument_found)
+ {
+ result = 0;
+ }
+ else
+ {
+ result = __LINE__;
+ }
+ }
+ }
+
+ return result;
+}