#include <libgen.h>
#include <stdio.h>
#include <ctype.h>
char * ME;
static struct u4_nm {
signed int u4;
unsigned char nm[256];
} u4_nm[0x10000];
static struct to_utf8_table_component2 {
unsigned int from;
unsigned int u4;
unsigned int u8;
signed char size;
} tbl[0x10000];
#define INDEX_FOR_BETWEEN_MAX 1000
void
usage(int status)
{
fprintf(stderr, "Usage: %s <mnemonic.txt> < <codeset.txt>\n", ME);
exit(status);
}
static void mk_u4nm (char *file);
main(int ac, char **av)
{
register int i, j;
char buf[BUFSIZ], num[100];
unsigned int l, k, index_for_between;
int mapflag[2];
int between[INDEX_FOR_BETWEEN_MAX];
ME = basename(av[0]);
if (ac <= 1) usage(-1);
mk_u4nm(av[1]);
for (i = 0; i < 0x10000; i++) {
tbl[i].size = 0;
}
while (fgets(buf, BUFSIZ, stdin)) {
i = 0;
while (buf[i] && isspace(buf[i]))
i++;
if (buf[i] == '#' || buf[i] == '\0')
continue;
for (j = 0; !isspace(buf[i]); i++, j++)
num[j] = buf[i];
num[j] = '\0';
k = strtol(num, (char **)NULL, 0);
while (isspace(buf[i]))
i++;
if (buf[i] == '#' || buf[i] == '\0')
continue;
for (j = 0; !isspace(buf[i]); i++, j++)
num[j] = buf[i];
num[j] = '\0';
l = strtol(num, (char **)NULL, 0);
if (tbl[k].size != 0) {
fprintf(stderr, "duplicated mapping for 0x%x\n", k );
}
tbl[k].u4 = l;
tbl[k].from = k;
if (l < 0x80)
tbl[k].size = 1;
else if (l < 0x800)
tbl[k].size = 2;
else if (l < 0x10000)
tbl[k].size = 3;
else if (l < 0x200000)
tbl[k].size = 4;
else if (l < 0x4000000)
tbl[k].size = 5;
else
tbl[k].size = 6;
}
for (i = 0; i < 0x100; i++) {
if (tbl[i].size > 0 ) {
if (u4_nm[tbl[i].u4].u4 >= 0){
printf("0x%0x\t%s\n", i, u4_nm[tbl[i].u4].nm);
} else {
printf("0x%0x\t ????????\n", i, u4_nm[tbl[i].u4].nm);
}
} else {
printf("0x%0x\t??\n", i);
}
}
return (0);
}
static void mk_u4nm (char *file)
{
register int i, j;
char buf[BUFSIZ], num[100];
unsigned int l, k, index_for_between;
int mapflag[2];
int between[INDEX_FOR_BETWEEN_MAX];
int somedatalost = 0;
FILE *fd;
for(i = 0; i < 0x1000; i++ ) {
u4_nm[k].u4 = -1;
}
if ((fd = fopen(file, "r")) == NULL) {
perror("fopen");
exit (-1);
}
while (fgets(buf, BUFSIZ, fd)) {
i = 0;
while (buf[i] && isspace(buf[i]))
i++;
if (buf[i] == '#' || buf[i] == '\0')
continue;
for (j = 0; !isspace(buf[i]); i++, j++)
num[j] = buf[i];
num[j] = '\0';
k = strtol(num, (char **)NULL, 16);
while (isspace(buf[i]))
i++;
if (buf[i] == '#' || buf[i] == '\0')
continue;
u4_nm[k].u4 = k;
for (j = 0; !isspace(buf[i]); i++, j++)
u4_nm[k].nm[j] = buf[i];
u4_nm[k].nm[j] = '\0';
}
}