opcodes2c.pl: Add command line options
[emu8051.git] / src / common / hexfile.c
index b32e671..b9aff06 100644 (file)
 
 static int asciihex2int_error;
 
+int
+asciihex2int_get_error(void)
+{
+       return asciihex2int_error;
+}
+
 /* Convert integer to ASCII hex string. */
 void
 int2asciihex(int val, char *str, int width)
 {
        if (width == 1)
-               sprintf(str , "%.1X", (u_int8_t) val);
+               sprintf(str , "%.1X", (uint8_t) val);
        else if (width == 2)
-               sprintf(str , "%.2X", (u_int8_t) val);
+               sprintf(str , "%.2X", (uint8_t) val);
        else if (width == 4)
-               sprintf(str , "%.4X", (u_int16_t) val);
+               sprintf(str , "%.4X", (uint16_t) val);
        else
                sprintf(str , "Err");
 }
 
-/* Convert ASCII hex string to integer. */
-int
-asciihex2int(char *str)
-{
-       int val;
-       int rc;
-
-       rc = sscanf(str, "%X", &val);
-
-       if (rc == 0) {
-               log_err("ASCII to hex conversion failure");
-               asciihex2int_error = true;
-       }
-
-       return val;
-}
-
-/* Convert an ascii string to an hexadecimal number. */
+/*
+ * Convert ASCII string in hexadecimal notation to integer, up to length
+ * characters.
+ * The string contains only [0-9] and [a-f] characters (no "0x" prefix).
+ */
 static unsigned int
-asciihex2int_len(char *istring, int length)
+asciihex2int_len(char *str, int length)
 {
        unsigned int result = 0;
        int i, ascii_code;
 
-       if (!length || (length > (int) strlen(istring)))
-               length = strlen(istring);
+       asciihex2int_error = false;
+
+       if (!length || (length > (int) strlen(str)))
+               length = strlen(str);
 
        for (i = 0; i < length; i++) {
-               ascii_code = istring[i];
+               ascii_code = str[i];
                if (ascii_code > 0x39)
                        ascii_code &= 0xDF;
 
@@ -86,11 +81,23 @@ asciihex2int_len(char *istring, int length)
                } else {
                        log_err("ASCII to hex conversion failure");
                        asciihex2int_error = true;
+                       return 0;
                }
        }
        return result;
 }
 
+/*
+ * Convert ASCII string in hexadecimal notation to integer, up to \0 end character.
+ * The string must not contain prefix "0x", only [0-9] and [a-f] characters.
+ */
+unsigned int
+asciihex2int(char *str)
+{
+       /* Set length to zero to use full length of string. */
+       return asciihex2int_len(str, 0);
+}
+
 /*
  * Return value:
  *   true:  success
@@ -108,14 +115,18 @@ hexfile_load(const char *filename)
 
        log_debug("LoadHexFile");
 
-       if (filename == NULL)
-               log_fail("No file specified");
+       if (filename == NULL) {
+               log_err("No file specified");
+               return false;
+       }
 
        /* Trying to open the file. */
        fp = fopen(filename, "r");
-       if (fp == NULL)
-               log_fail("Error opening hex file <%s>: %s", filename,
-                        strerror(errno));
+       if (fp == NULL) {
+               log_err("Error opening hex file <%s>: %s", filename,
+                       strerror(errno));
+               return false;
+       }
 
        /* Reading one line of data from the hex file. */
        /* char *fgets(char *s, int size, FILE *stream);
@@ -183,11 +194,12 @@ hexfile_load(const char *filename)
 
 close_file:
        status = fclose(fp);
-       if (status != EXIT_SUCCESS)
-               log_fail("Error closing hex file");
-
-       if (!valid)
+       if (status != EXIT_SUCCESS) {
+               log_err("Error closing hex file");
+               valid = false;
+       } else if (!valid) {
                log_err("Error parsing hex file");
+       }
 
        return valid;
 }