#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unilib.h>
void usage(char *pname);
void printlstring(int count, char *str);
void printustring(int count, unicode_t *uni);
void usage(char *pname)
{
fprintf(stderr, "%s -- a sample program\n", pname);
fprintf(stderr, " %s [-option] argument\n", pname);
fprintf(stderr, "\n");
fprintf(stderr, "Options:\n");
fprintf(stderr, " -v verbose\n");
fprintf(stderr, " -h this message\n");
fprintf(stderr, " -? this message\n");
fprintf(stderr, "\n");
}
void printlstring(int count, char *str)
{
int i;
for (i = 0; i < count; i++)
printf("%02X ", str[i]&0xFF);
printf("\n");
}
void printustring(int count, unicode_t *uni)
{
int i;
for (i = 0; i < count; i++)
printf("%04X ", uni[i]);
printf("\n");
}
int main(int argc, char* argv[])
{
int i, err, verbose = FALSE;
char *cp, *opt, errstr[256], *utf8, *buf;
char sjis[] = { (char)0x83, (char)0x5c, (char)0xbe, (char)0xd0,
(char)0x93, (char)0xfa, (char)0x95, (char)0x5c, (char)0 };
char asc[] = { (char)0x52, (char)0x77, (char)0x70, (char)0x68,
(char)0 };
size_t actSize, buflen;
unicode_t *uni;
UniRuleTable_t table;
if (argc<2)
{
usage(argv[0]);
return -1;
}
for (i = 1; i < argc; i++)
{
cp = argv[i];
if (*cp == '-')
{
cp++;
opt = cp;
switch (tolower(*opt))
{
case 'v':
fprintf(stdout, "\tVerbose mode\n");
verbose = TRUE;
break;
case 'h':
case '?':
usage(argv[0]);
return 0;
}
}
else
{
fprintf(stdout, "program argument %s\n", argv[i]);
}
}
if (err = UniGetTable(932, &table))
{
sprintf(errstr, "UniGetTable. err=%d", err);
goto END_ERR;
}
actSize = strlen(sjis) + 1;
uni = (unicode_t *) malloc(sizeof(unicode_t) * actSize);
buflen = actSize * 5;
utf8 = (char *) malloc(sizeof(char) * buflen);
buf = (char *) malloc(sizeof(char) * buflen);
err = locn2uni(table, uni, &actSize, sjis, strlen(sjis), 0xFF, UNI_MAP_CHAR);
if (err)
{
sprintf(errstr,
"locn2uni. actSize=%d, unisize=%d, err=%d", actSize, unisize(uni), err);
if (verbose)
printustring(actSize, uni);
goto END_ERR;
}
*(uni + actSize) = 0;
fprintf(stderr, "locn2uni with Shift_JIS ..... OK.\n");
if (verbose)
{
fprintf(stdout, " From "); printlstring(strlen(sjis), sjis);
fprintf(stdout, " To "); printustring(actSize, uni);
}
actSize = buflen;
err = locn2utf8(table, utf8, &actSize, sjis, strlen(sjis), 0xFF,
UNI_MAP_CHAR);
if (err)
{
sprintf(errstr,
"locn2utf8. actSize=%d, strlen=%d, err=%d", actSize, strlen(utf8), err);
if (verbose)
printlstring(actSize, utf8);
goto END_ERR;
}
fprintf(stderr, "locn2utf8 with Shift_JIS ..... OK.\n");
if (verbose)
{
fprintf(stdout, " From "); printlstring(strlen(sjis), sjis);
fprintf(stdout, " To "); printlstring(actSize, utf8);
}
actSize = buflen;
err = loc2utf8(table, utf8, sjis, 0xFF, UNI_MAP_CHAR);
if (err)
{
sprintf(errstr, "loc2utf8. strlen=%d, err=%d", strlen(utf8), err);
if (verbose)
printlstring(strlen(utf8), utf8);
goto END_ERR;
}
fprintf(stderr, "loc2utf8 with Shift_JIS ..... OK.\n");
if (verbose)
{
fprintf(stdout, " From ");
printlstring(strlen(sjis), sjis);
fprintf(stdout, " To ");
printlstring(strlen(utf8), utf8);
}
err = uni2utf8(utf8, uni);
if (err)
{
sprintf(errstr, "uni2utf8. unisize=%d, err=%d", unilen(uni), err);
if (verbose)
printlstring(strlen(utf8), utf8);
goto END_ERR;
}
fprintf(stderr, "uni2utf8 with Shift_JIS ..... OK.\n");
if (verbose)
{
fprintf(stdout, " From ");
printustring(unilen(uni), uni);
fprintf(stdout, " To ");
printlstring(strlen(utf8), utf8);
}
err = unin2loc(table, buf, &buflen, uni, unilen(uni), 0xFF, UNI_MAP_CHAR);
if (err)
{
sprintf(errstr, "unin2loc. unilen=%d, err=%d", unilen(uni), err);
if (verbose)
printustring(unilen(uni), uni);
goto END_ERR;
}
fprintf(stderr, "unin2loc with Shift_JIS ..... OK.\n");
*(buf + buflen) = '\0';
if (verbose)
{
fprintf(stdout, " From ");
printustring(unilen(uni), uni);
fprintf(stdout, " To ");
printlstring(strlen(buf), buf);
}
asc2uni(uni, asc);
fprintf(stderr, "asc2uni with %s ..... OK.\n", asc);
if (verbose)
{
fprintf(stdout, " From ");
printlstring(strlen(asc), asc);
fprintf(stdout, " To ");
printustring(unilen(uni), uni);
}
fprintf(stdout, "unilen(uni) = %d.\n", unilen(uni));
fprintf(stdout, "unisize(uni) = %d.\n", unisize(uni));
goto EXIT;
END_ERR:
fprintf(stderr, "Error... %s\n", errstr);
EXIT:
if (table)
UniDisposeTable(table);
if (utf8)
free(utf8);
if (uni)
free(uni);
return err;
}