summaryrefslogtreecommitdiff
path: root/src/options.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/options.c')
-rw-r--r--src/options.c40
1 files changed, 22 insertions, 18 deletions
diff --git a/src/options.c b/src/options.c
index c751b36..9bfb030 100644
--- a/src/options.c
+++ b/src/options.c
@@ -113,9 +113,12 @@
if(argc < 1 || argv[i+1][0] == '-') \
return i; \
if(VALUE.buf_) free(VALUE.buf_); \
- VALUE = options_parse_hex_string(argv[i+1]); \
- if(!VALUE.buf_) \
- return -2; \
+ int ret; \
+ ret = options_parse_hex_string(argv[i+1], &VALUE); \
+ if(ret > 0) \
+ return i+1; \
+ else if(ret < 0) \
+ return ret; \
size_t j; \
for(j=0; j < strlen(argv[i+1]); ++j) \
argv[i+1][j] = '#'; \
@@ -123,34 +126,35 @@
i++; \
}
-buffer_t options_parse_hex_string(const char* hex)
+int options_parse_hex_string(const char* hex, buffer_t* buffer)
{
- u_int32_t hex_len = strlen(hex);
- buffer_t buffer;
+ if(!hex || !buffer)
+ return -1;
- buffer.length_ = 0;
- buffer.buf_ = NULL;
+ u_int32_t hex_len = strlen(hex);
+ if(hex_len%2)
+ return 1;
- if(hex_len%2)
- return buffer;
+ if(buffer->buf_)
+ free(buffer->buf_);
- buffer.length_ = hex_len/2;
- buffer.buf_ = malloc(buffer.length_);
- if(!buffer.buf_) {
- buffer.length_ = 0;
- return buffer;
+ buffer->length_ = hex_len/2;
+ buffer->buf_ = malloc(buffer->length_);
+ if(!buffer->buf_) {
+ buffer->length_ = 0;
+ return -2;
}
const char* ptr = hex;
int i;
- for(i=0;i<buffer.length_;++i) {
+ for(i=0;i<buffer->length_;++i) {
u_int32_t tmp;
sscanf(ptr, "%2X", &tmp);
- buffer.buf_[i] = (u_int8_t)tmp;
+ buffer->buf_[i] = (u_int8_t)tmp;
ptr += 2;
}
- return buffer;
+ return 0;
}
int options_parse(options_t* opt, int argc, char* argv[])