X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fhelper%2Fcommand.c;h=ec1d637f15abebca01d195eaf5869eacf32fecb0;hb=e43979e7020ea9d05a3c0a2af444f292eacb6c53;hp=9a8907d6ac13374264339f868c19820264bb2105;hpb=06a1bb335e0971a7b986d7726c48d1502e2517c4;p=fw%2Fopenocd diff --git a/src/helper/command.c b/src/helper/command.c index 9a8907d6a..ec1d637f1 100644 --- a/src/helper/command.c +++ b/src/helper/command.c @@ -348,7 +348,7 @@ int unregister_command(command_context_t *context, char *name) void command_output_text(command_context_t *context, const char *data) { - if( context && context->output_handler && data ){ + if ( context && context->output_handler && data ){ context->output_handler( context, data ); } } @@ -867,16 +867,47 @@ long jim_global_long(const char *variable) int parse##name(const char *str, type *ul) \ { \ if (!*str) \ - return ERROR_COMMAND_SYNTAX_ERROR; \ + return ERROR_COMMAND_ARGUMENT_INVALID; \ char *end; \ *ul = func(str, &end, 0); \ if (*end) \ - return ERROR_COMMAND_SYNTAX_ERROR; \ - if (*ul == max || (min && min == *ul)) \ - return ERROR_COMMAND_SYNTAX_ERROR; \ + return ERROR_COMMAND_ARGUMENT_INVALID; \ + if ((max == *ul) && (ERANGE == errno)) \ + return ERROR_COMMAND_ARGUMENT_OVERFLOW; \ + if (min && (min == *ul) && (ERANGE == errno)) \ + return ERROR_COMMAND_ARGUMENT_UNDERFLOW; \ return ERROR_OK; \ } DEFINE_PARSE_NUM_TYPE(_ulong, unsigned long , strtoul, 0, ULONG_MAX) DEFINE_PARSE_NUM_TYPE(_ullong, unsigned long long, strtoull, 0, ULLONG_MAX) DEFINE_PARSE_NUM_TYPE(_long, long , strtol, LONG_MIN, LONG_MAX) DEFINE_PARSE_NUM_TYPE(_llong, long long, strtoll, LLONG_MIN, LLONG_MAX) + +#define DEFINE_PARSE_WRAPPER(name, type, min, max, functype, funcname) \ + int parse##name(const char *str, type *ul) \ + { \ + functype n; \ + int retval = parse##funcname(str, &n); \ + if (ERROR_OK != retval) \ + return retval; \ + if (n > max) \ + return ERROR_COMMAND_ARGUMENT_OVERFLOW; \ + if (min) \ + return ERROR_COMMAND_ARGUMENT_UNDERFLOW; \ + *ul = n; \ + return ERROR_OK; \ + } + +#define DEFINE_PARSE_ULONG(name, type, min, max) \ + DEFINE_PARSE_WRAPPER(name, type, min, max, unsigned long, _ulong) +DEFINE_PARSE_ULONG(_uint, unsigned, 0, UINT_MAX) +DEFINE_PARSE_ULONG(_u32, uint32_t, 0, UINT32_MAX) +DEFINE_PARSE_ULONG(_u16, uint16_t, 0, UINT16_MAX) +DEFINE_PARSE_ULONG(_u8, uint8_t, 0, UINT8_MAX) + +#define DEFINE_PARSE_LONG(name, type, min, max) \ + DEFINE_PARSE_WRAPPER(name, type, min, max, long, _long) +DEFINE_PARSE_LONG(_int, int, n < INT_MIN, INT_MAX) +DEFINE_PARSE_LONG(_s32, int32_t, n < INT32_MIN, INT32_MAX) +DEFINE_PARSE_LONG(_s16, int16_t, n < INT16_MIN, INT16_MAX) +DEFINE_PARSE_LONG(_s8, int8_t, n < INT8_MIN, INT8_MAX)