/*
hexcom.c
makes a com file from a hex file.  Uses standard I/O

Sample input file:

:100100003EFF87D200003E0187DA0000AFC2000048
:100110003CCA00003DFA00003DF200003E7F3CE298
:100120000000E6FFEA00001132010E09CD0500C310
:0701300000004F4B0D0A24F3
:0000000000

*/

#include        <stdio.h>
#include        <string.h>
#include        <stdlib.h>
#include        <stdarg.h>

static char     *progname;

static void     err_exit(const char *s, ...)
{
       va_list ap;

       fprintf(stderr, "%s: ", progname);
       va_start(ap, s);
       vfprintf(stderr, s, ap);
       va_end(ap);
       exit(1);
}

static int      gethex(const char *p)
{
       int             r, c;

       if (!(c = *p++))
               return(-1);

       if (c >= 'A')
               c += 9;

       r = (c & 0x0f) << 4;

       if (!(c = *p))
               return(-1);

       if (c >= 'A')
               c += 9;

       return(r + (c & 0x0f));
}

static void     hexcom(FILE *in_fp, FILE *out_fp)
{
       char    *p;
       int             count, b;

       while ((p = getline(in_fp, 0)) != NULL)
       {
               if (*p++ != ':')
                       err_exit("Line doesn't start with colon");

               if ((count = gethex(p)) == -1)
                       err_exit("Invalid byte count in line");

               p += 8;

               while (count--)
               {
                       if ((b = gethex(p)) == -1)
                               err_exit("invalid byte in line");

                       p += 2;
                       putc(b, out_fp);
               }
       }
}

int             main(int argc, char **argv)
{
       FILE    *in_fp, *out_fp;
       char    buf[256], *p, *q;
       int             k;

       if ((progname = strrchr(argv[0], '/')) == NULL)
               progname = argv[0];
       else
               progname++;

       if (argc == 1)
       {
               hexcom(stdin, stdout);
               return(0);
       }

       for (k = 1; k < argc; k++)
       {
               strcpy(buf, argv[k]);

               if ((p = strrchr(buf, '.')) == NULL ||
                       ((q = strrchr(buf, '/')) != NULL && p < q))
                               strcat(buf, ".hex");

               if ((in_fp = fopen(buf, "rt")) == NULL)
                       err_exit("Can't open %s: %s", buf, strerror(errno));

               strcpy(strrchr(buf, '.'), ".com");

               if ((out_fp = fopen(buf, "wb")) == NULL)
                       err_exit("Can't open %s: %s", buf, strerror(errno));

               hexcom(in_fp, out_fp);
       }

       return(0);
}