unlink temp file fix for qsort.
author"Darron Broad" <darron@kewl.org>
Wed, 19 Jun 2019 19:00:12 +0100
changeset 1097 360de600eba2
parent 1096 ca8aee175cad
child 1098 f6e8a76176f7
unlink temp file fix for qsort.

todo: change api for tree sort
src/inhx32.c
--- 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;
 }