/*
  ＣＤＵＭＰ.ＥＸＥ v1.1
  Ｃ言語形式ファイルダンププログラム
                    Y.Tsuzi[1995, 4]
*/

/*
 log :
   1995, 4, ?	v1.1	完成
   1995, 5, 4	v1.2	出力形式を変更。（１６けたから１０けたへ）
   1995, 5, 7	v1.3	右側に文字表示を追加（漢字は表示できない）
 			ファイルのサイズ表示を追加
*/

#include <stdio.h>
#include <string.h>
#include <jctype.h>
#include <sys/stat.h>
#include "../inc/getopt.h"

int	help(char *c);
int	dump(char *s);

int	main(int argc, char **argv)
{
    int		c;
    char	*opt2;
    char	*filename[30];
    int		num = 0;
    
    fprintf(stderr, "cdump.exe v1.3 Ｃ言語形式ファイルダンプ\n");
    fprintf(stderr, "%40s\n", "Y.Tsuzi[" __DATE__ "]");
    
    if(argc == 1) {
	help(argv[0]);
	return 1;
    }
    
    setopt(argc, argv);
    
    while((c = getopt('-', "?Hh", &opt2)) >= 0) {
	switch(c) {
	case 'h':
	case 'H':
	case '?':
	    help(argv[0]);
	    return 1;
	case 0:
	    if(num < 30) {
		filename[num] = opt2;
		num++;
	    }
	    break;
	default:
	    printf("error : option? '%c'\n", c);
	    help(argv[0]);
	    return 1;
	}
    }
    
    for(c = 0; c < num; c++)
	if(dump(filename[c])) return 1;
    
    return 0;
}

int	help(char *c)
{
    fprintf(stderr, " %s [-h] [file...]\n", c);
    fprintf(stderr, " -h : ヘルプ\n");
    fprintf(stderr, " file... : ファイル名\n");
    return 0;
}

int	dump(char *file)
{
    FILE *fp;
    char buf[10];
    struct stat sbuf;
    
    if((fp = fopen(file, "rb")) == NULL) {
	fprintf(stderr, "ファイルがオープンできません。\n");
	return 1;
    }
    
    fstat(fileno(fp), &sbuf);
    printf("/* file : %s : %8ld byte */\n", file, sbuf.st_size);
    while(1) {
	int	i, j;
	
	if((i = fread(buf, 1, 10, fp)) <= 0) break;
	for(j = 0; j < i; j++) {
	    printf("0x%02X, ", buf[j]);
	}
	printf("  /* ");
	for(j = 0; j < i; j++) {
	    if(0x1F < buf[j] && buf[j] <= 0x7E) {
		printf("%c", buf[j]);
	    } else {
		printf(".");
	    }
	}
	printf(" */\n");
    }
    
    fclose(fp);
    
    return 0;
}
