linux/sound/oss/hex2hex.c
<<
>>
Prefs
   1/*
   2 * hex2hex reads stdin in Intel HEX format and produces an
   3 * (unsigned char) array which contains the bytes and writes it
   4 * to stdout using C syntax
   5 */
   6
   7#include <stdio.h>
   8#include <string.h>
   9#include <stdlib.h>
  10
  11#define ABANDON(why) { fprintf(stderr, "%s\n", why); exit(1); }
  12#define MAX_SIZE (256*1024)
  13unsigned char buf[MAX_SIZE];
  14
  15static int loadhex(FILE *inf, unsigned char *buf)
  16{
  17        int l=0, c, i;
  18
  19        while ((c=getc(inf))!=EOF)
  20        {
  21                if (c == ':')   /* Sync with beginning of line */
  22                {
  23                        int n, check;
  24                        unsigned char sum;
  25                        int addr;
  26                        int linetype;
  27
  28                        if (fscanf(inf, "%02x", &n) != 1)
  29                           ABANDON("File format error");
  30                        sum = n;
  31
  32                        if (fscanf(inf, "%04x", &addr) != 1)
  33                           ABANDON("File format error");
  34                        sum += addr/256;
  35                        sum += addr%256;
  36
  37                        if (fscanf(inf, "%02x", &linetype) != 1)
  38                           ABANDON("File format error");
  39                        sum += linetype;
  40
  41                        if (linetype != 0)
  42                           continue;
  43
  44                        for (i=0;i<n;i++)
  45                        {
  46                                if (fscanf(inf, "%02x", &c) != 1)
  47                                   ABANDON("File format error");
  48                                if (addr >= MAX_SIZE)
  49                                   ABANDON("File too large");
  50                                buf[addr++] = c;
  51                                if (addr > l)
  52                                   l = addr;
  53                                sum += c;
  54                        }
  55
  56                        if (fscanf(inf, "%02x", &check) != 1)
  57                           ABANDON("File format error");
  58
  59                        sum = ~sum + 1;
  60                        if (check != sum)
  61                           ABANDON("Line checksum error");
  62                }
  63        }
  64
  65        return l;
  66}
  67
  68int main( int argc, const char * argv [] )
  69{
  70        const char * varline;
  71        int i,l;
  72        int id=0;
  73
  74        if(argv[1] && strcmp(argv[1], "-i")==0)
  75        {
  76                argv++;
  77                argc--;
  78                id=1;
  79        }
  80        if(argv[1]==NULL)
  81        {
  82                fprintf(stderr,"hex2hex: [-i] filename\n");
  83                exit(1);
  84        }
  85        varline = argv[1];
  86        l = loadhex(stdin, buf);
  87
  88        printf("/*\n *\t Computer generated file. Do not edit.\n */\n");
  89        printf("static int %s_len = %d;\n", varline, l);
  90        printf("static unsigned char %s[] %s = {\n", varline, id?"__initdata":"");
  91
  92        for (i=0;i<l;i++)
  93        {
  94                if (i) printf(",");
  95                if (i && !(i % 16)) printf("\n");
  96                printf("0x%02x", buf[i]);
  97        }
  98
  99        printf("\n};\n\n");
 100        return 0;
 101}
 102