--- a/src/inhx32.c Wed Jun 19 18:04:29 2019 +0100
+++ b/src/inhx32.c Wed Jun 19 19:00:12 2019 +0100
@@ -158,23 +158,21 @@
}
static int
-inhx32_perror(int err, int val)
+inhx32_error(int err, int val)
{
static char warning[] = "warning", error[] = "error";
char *msg;
- int rc;
+ int rc = 0; /* No error */
if (err >= 0)
- return 0; /* No warning or error */
+ return rc;
if (p.error & BADINPUT) {
+ rc = -1; /* Error */
msg = error;
- rc = -1; /* Error */
} else {
msg = warning;
- rc = 0; /* Warning */
}
-
if (p.f) switch (err) {
case -1:fprintf(p.f, "%s: %s: invalid line prefix\n", __func__, msg);
break;
@@ -200,48 +198,47 @@
/*
* Get data
*
- * Returns with either a data record or NULL for EOF
+ * Returns number of bytes, 0 = EOF and < 0 is error
*/
-pic_data *
-inhx32_get(FILE *fp)
+int
+inhx32_get(FILE *fp, pic_data **data)
{
char line[STRLEN];
uint8_t bb, tt;
uint16_t aaaa, ix, i;
static uint16_t extended_addr = 0;
- pic_data *data;
int rc;
do {
/* Get line */
rc = inhx32_fgets(line, fp, &bb, &aaaa, &tt, &extended_addr);
if (rc == 0 || tt == TT_EOF)
- return NULL; /* EOF */
- if (inhx32_perror(rc, tt) < 0)
- /* exit pending */;
+ return 0; /* EOF */
+ if (inhx32_error(rc, tt) < 0)
+ return -1; /* Error */
}
while (tt != TT_DATA); /* Skip non data records */
/* Allocate data */
- data = (pic_data *)calloc(1, sizeof(pic_data));
- if (data == NULL) {
+ *data = (pic_data *)calloc(1, sizeof(pic_data));
+ if (*data == NULL) {
printf("%s: fatal error: calloc failed\n", __func__);
io_exit(EX_OSERR); /* Panic */
}
/* Store address and number of bytes */
- data->address = (extended_addr << 16) | aaaa;
- data->nbytes = bb;
+ (*data)->address = (extended_addr << 16) | aaaa;
+ (*data)->nbytes = bb;
/* Extract and store bytes */
ix = HHHH;
for (i = 0; i < bb; ++i) {
- data->bytes[i] = hex2byte(&line[ix]);
+ (*data)->bytes[i] = hex2byte(&line[ix]);
ix += 2;
}
- /* Return data */
- return data;
+ /* Return number of bytes */
+ return bb;
}
/******************************************************************************
@@ -394,6 +391,7 @@
char tempname[] = "/tmp/inhx32.XXXXXX";
uint32_t nbytes, index = 0;
pic_data *data;
+ int rc;
*count = 0;
@@ -417,8 +415,8 @@
io_exit(EX_OSERR); /* Panic */
}
- /* While not EOF, process data */
- while ((data = inhx32_get(fp))) {
+ /* While not EOF or error, process data */
+ while ((rc = inhx32_get(fp, &data)) > 0) {
(*pdata)[index++] = data;
}
fclose(fp);
@@ -427,6 +425,10 @@
if (tempname[0])
unlink(tempname);
+ /* Exit on error condition */
+ if (rc < 0)
+ io_exit(BADINPUT);
+
/* Quick sort array */
qsort(*pdata, *count, sizeof(pic_data *), inhx32_array_compare);
@@ -464,6 +466,7 @@
char tempname[] = "/tmp/inhx32.XXXXXX";
uint32_t nbytes, count = 0, index = 0;
pic_data *data;
+ int rc;
uint8_t i;
/*
@@ -487,7 +490,7 @@
}
/* While not EOF, process data */
- while ((data = inhx32_get(fp))) {
+ while ((rc = inhx32_get(fp, &data)) > 0) {
for (i = 0; i < data->nbytes; ++i)
(*pmem)[index++] = data->bytes[i];
}
@@ -497,6 +500,10 @@
if (tempname[0])
unlink(tempname);
+ /* Exit on error condition */
+ if (rc < 0)
+ io_exit(BADINPUT);
+
/* Return number of bytes */
return nbytes;
}