#include "sys/param.h"
#include "sys/systm.h"
#include "sys/cdefs.h"
#include "sys/malloc.h"
#include "sys/iconv.h"
int printf(const char* format, ...);
int
fat_iconv_open(const char* to, const char* from, void** handle)
{
#ifdef USER
iconv_t descriptor = iconv_open(to, from);
if (descriptor == (iconv_t)(-1))
return errno;
*handle = descriptor;
return 0;
#else
return ENOTSUP;
#endif
}
int
fat_iconv_close(void* handle)
{
#ifdef USER
iconv_t* descriptor = (iconv_t*)handle;
int error = 0;
error = iconv_close(descriptor);
return error;
#else
return ENOTSUP;
#endif
}
int
iconv_conv(void* handle, const char** inbuf, size_t* inbytesleft, char** outbuf,
size_t* outbytesleft)
{
#ifdef USER
while (iconv(handle, __DECONST(char**, inbuf), inbytesleft, outbuf, outbytesleft) != (size_t)-1
&& *inbytesleft > 0 && strlen(*inbuf) > 0)
;
return 0;
#else
return ENOTSUP;
#endif
}
int
iconv_convchr(void* handle, const char** inbuf, size_t* inbytesleft, char** outbuf,
size_t* outbytesleft)
{
#ifdef USER
int status = iconv(handle, __DECONST(char**, inbuf), inbytesleft, outbuf, outbytesleft);
return status;
#else
return ENOTSUP;
#endif
}
int
iconv_convchr_case(void* handle, const char** inbuf, size_t* inbytesleft, char** outbuf,
size_t* outbytesleft, int casetype)
{
#ifdef USER
size_t status = 0;
int inbufAdvanced = 0;
if (casetype == KICONV_FROM_LOWER || casetype == KICONV_FROM_UPPER) {
char finalInbuf[4];
char* finalInbufPtr = finalInbuf;
int (*tocase)(int ch) = (casetype == KICONV_FROM_LOWER) ? tolower : toupper;
int i;
for (i = 0; i < 4; i++)
finalInbuf[i] = tocase((*inbuf)[i]);
status = iconv(handle, &finalInbufPtr, inbytesleft, outbuf, outbytesleft);
if (status == (size_t)(-1))
printf("FAT iconv_convchr_case: %s\n", strerror(errno));
inbufAdvanced = finalInbufPtr - finalInbuf;
*inbuf += inbufAdvanced;
return status;
}
if (casetype == KICONV_LOWER) {
status = iconv(handle, __DECONST(char**, inbuf), inbytesleft, outbuf, outbytesleft);
**outbuf = tolower(**outbuf);
return status;
}
printf("FAT iconv_convchr_case: unrecognized casetype\n");
return -1;
#else
return ENOTSUP;
#endif
}