Viewing file:
unicodetest.c (3.28 KB) -rw-rw-rw-Select action/file-type:

(
+) |

(
+) |

(
+) |
Code (
+) |
Session (
+) |

(
+) |
SDB (
+) |

(
+) |

(
+) |

(
+) |

(
+) |

(
+) |
/*
** Copyright 2011 Double Precision, Inc.
** See COPYING for distribution information.
**
*/
#include "unicode_config.h"
#include "unicode.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
struct collect_buf {
char *ptr;
size_t cnt;
size_t size;
};
static int save_output(const char *p, size_t n, void *ptr)
{
struct collect_buf *cb=(struct collect_buf *)ptr;
while (n)
{
if (cb->cnt < cb->size)
cb->ptr[cb->cnt++]=*p;
++p;
--n;
}
return 0;
}
static void test1()
{
static const char teststr[]= {
0x00, 0x00, 0x00, 0x41,
0x00, 0x00, 0x04, 0x14,
0x00, 0x00, 0x04, 0x30,
0x00, 0x00, 0x00, 0x42};
char outputbuf[12];
struct collect_buf cb;
libmail_u_convert_handle_t h;
int checkflag;
cb.ptr=outputbuf;
cb.cnt=0;
cb.size=sizeof(outputbuf);
if ((h=libmail_u_convert_init("UCS-4BE", "ISO-8859-1",
save_output, &cb)) == NULL)
{
perror("libmail_u_convert_init");
exit(1);
}
libmail_u_convert(h, teststr, sizeof(teststr));
if (libmail_u_convert_deinit(h, &checkflag))
{
perror("libmail_u_convert_deinit");
exit(1);
}
if (cb.cnt != 2 || memcmp(cb.ptr, "AB", 2) || !checkflag)
{
fprintf(stderr, "Unexpected result from convert()\n");
exit(1);
}
}
static void test2()
{
unicode_char *ucptr;
size_t ucsize;
libmail_u_convert_handle_t h=
libmail_u_convert_tou_init("utf-8", &ucptr, &ucsize, 1);
char *cptr;
size_t csize;
if (h)
{
size_t i;
for (i=0; i<1024/32; ++i)
libmail_u_convert(h, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
32);
if (libmail_u_convert_deinit(h, NULL) == 0 &&
ucsize == 1024+1)
{
for (i=0; i<1024; i++)
if (ucptr[i] != 'A')
break;
if (i == 1024)
{
h=libmail_u_convert_fromu_init("utf-8",
&cptr, &csize,
1);
if (h)
{
libmail_u_convert_uc(h, ucptr, 1024);
if (libmail_u_convert_deinit(h, NULL)
== 0 && csize == 1024+1)
{
for (i=0; i<1024; i++)
if (cptr[i] != 'A')
break;
free(ucptr);
free(cptr);
if (i == 1024)
return;
}
}
}
}
fprintf(stderr, "test2: failed");
errno=EINVAL;
}
perror("test2");
exit(1);
}
int main(int argc, char **argv)
{
const char *chset=unicode_x_imap_modutf7;
int argn=1;
if (argn < argc && strcmp(argv[argn], "--smap") == 0)
{
chset=unicode_x_imap_modutf7 " ./~:";
++argn;
}
if (argn < argc && strcmp(argv[argn], "--totitle") == 0)
{
++argn;
if (argn < argc)
{
char *p=libmail_u_convert_tocase(argv[argn],
"utf-8",
unicode_tc,
unicode_lc);
if (p)
{
printf("%s\n", p);
free(p);
exit(0);
}
}
exit(1);
}
if (argn < argc)
{
int errflag;
char *p=libmail_u_convert_tobuf(argv[argn],
"utf-8",
chset,
&errflag);
char *q;
if (!p)
{
perror("libmail_u_convert");
exit(1);
}
if (errflag)
{
fprintf(stderr, "Conversion error?\n");
exit(1);
}
q=libmail_u_convert_tobuf(p, chset, "utf-8", &errflag);
if (!q)
{
perror("libmail_u_convert");
exit(1);
}
if (errflag)
{
fprintf(stderr, "Conversion error?\n");
exit(1);
}
if (strcmp(q, argv[argn]))
{
fprintf(stderr, "Round trip error\n");
exit(1);
}
printf("%s\n", p);
free(p);
free(q);
}
else
{
test1();
test2();
}
return 0;
}