Subversion Repositories SvarDOS

Rev

Rev 397 | Rev 477 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
349 mateuszvis 1
/*
2
 * translates a binary file to a C include.
3
 * used by the SvarCOM build process to embedd rcom inside COMMAND.COM
4
 *
5
 * Copyright (C) 2021 Mateusz Viste
6
 */
7
 
8
#include <stdio.h>
9
 
432 mateuszvis 10
 
11
static void help(void) {
12
  puts("usage: file2c [/c] [/lxxx] infile.dat outfile.c varname");
13
  puts("");
14
  puts("/c    - define the output array as CONST");
15
  puts("/lxxx - enforces the output array to be xxx bytes big");
16
}
17
 
18
 
349 mateuszvis 19
int main(int argc, char **argv) {
432 mateuszvis 20
  char *fnamein = NULL, *fnameout = NULL, *varname = NULL;
21
  char flag_c = 0;
22
  char *flag_l = "";
349 mateuszvis 23
  FILE *fdin, *fdout;
24
  unsigned long len;
25
  int c;
26
 
432 mateuszvis 27
  for (c = 1; c < argc; c++) {
28
    if ((argv[c][0] == '/') && (argv[c][1] == 'l')) {
29
      flag_l = argv[c] + 2;
30
      continue;
31
    }
32
    if ((argv[c][0] == '/') && (argv[c][1] == 'c')) {
33
      flag_c = 1;
34
      continue;
35
    }
36
    if (argv[c][0] == '/') {
37
      help();
38
      return(1);
39
    }
40
    /* not a switch - so it's either infile, outfile or varname */
41
    if (fnamein == NULL) {
42
      fnamein = argv[c];
43
    } else if (fnameout == NULL) {
44
      fnameout = argv[c];
45
    } else if (varname == NULL) {
46
      varname = argv[c];
47
    } else {
48
      help();
49
      return(1);
50
    }
51
  }
52
 
53
  if (varname == NULL) {
54
    help();
349 mateuszvis 55
    return(1);
56
  }
57
 
432 mateuszvis 58
  fdin = fopen(fnamein, "rb");
349 mateuszvis 59
  if (fdin == NULL) {
60
    puts("ERROR: failed to open input file");
61
    return(1);
62
  }
63
 
432 mateuszvis 64
  fdout = fopen(fnameout, "wb");
349 mateuszvis 65
  if (fdout == NULL) {
66
    fclose(fdin);
67
    puts("ERROR: failed to open output file");
68
    return(1);
69
  }
70
 
432 mateuszvis 71
  if (flag_c) fprintf(fdout, "const ");
72
  fprintf(fdout, "char %s[%s] = {", varname, flag_l);
73
 
349 mateuszvis 74
  for (len = 0;; len++) {
75
    c = getc(fdin);
76
    if (c == EOF) break;
77
    if (len > 0) fprintf(fdout, ",");
78
    if ((len & 15) == 0) fprintf(fdout, "\r\n");
79
    fprintf(fdout, "%3u", c);
80
  }
81
  fprintf(fdout, "};\r\n");
432 mateuszvis 82
  fprintf(fdout, "#define %s_len %lu\r\n", varname, len);
349 mateuszvis 83
 
84
  fclose(fdin);
85
  fclose(fdout);
86
  return(0);
87
}