view src/lib-charset/charset-utf8.c @ 766:03832c7f389b HEAD

Compiles again without iconv()
author Timo Sirainen <tss@iki.fi>
date Mon, 09 Dec 2002 15:39:32 +0200
parents 3521edb6c240
children d96cbba73a8b
line wrap: on
line source

/* Copyright (C) 2002 Timo Sirainen */

#include "lib.h"
#include "buffer.h"
#include "charset-utf8.h"

#include <ctype.h>

void _charset_utf8_ucase(const unsigned char *src, size_t src_size,
			 Buffer *dest, size_t destpos)
{
	char *destbuf;
	size_t i;

	destbuf = buffer_get_space(dest, destpos, src_size);
	for (i = 0; i < src_size; i++)
		destbuf[i] = i_toupper(src[i]); /* FIXME: utf8 */
}

const char *_charset_utf8_ucase_strdup(const Buffer *data, size_t *utf8_size)
{
	const char *buf;
	size_t size;
	Buffer *dest;

	buf = buffer_get_data(data, &size);

	dest = buffer_create_dynamic(data_stack_pool, size, (size_t)-1);
	_charset_utf8_ucase(buf, size, dest, 0);
	if (utf8_size != NULL)
		*utf8_size = buffer_get_used_size(dest);
	buffer_append_c(dest, '\0');
	return buffer_free_without_data(dest);
}


#ifndef HAVE_ICONV_H

#include <ctype.h>

struct _CharsetTranslation {
	int dummy;
};

static CharsetTranslation ascii_translation, utf8_translation;

CharsetTranslation *charset_to_utf8_begin(const char *charset,
					  int *unknown_charset)
{
	if (unknown_charset != NULL)
		*unknown_charset = FALSE;

	if (strcasecmp(charset, "us-ascii") == 0 ||
	    strcasecmp(charset, "ascii") == 0)
		return &ascii_translation;

	if (strcasecmp(charset, "UTF-8") == 0 ||
	    strcasecmp(charset, "UTF8") == 0)
		return &utf8_translation;

	/* no support for charsets that need translation */
	if (unknown_charset != NULL)
		*unknown_charset = TRUE;
	return NULL;
}

void charset_to_utf8_end(CharsetTranslation *t __attr_unused__)
{
}

void charset_to_utf8_reset(CharsetTranslation *t __attr_unused__)
{
}

CharsetResult
charset_to_ucase_utf8(CharsetTranslation *t __attr_unused__,
		      const Buffer *src, size_t *src_pos, Buffer *dest)
{
	size_t size, destpos, destleft;

	destpos = buffer_get_used_size(dest);
	destleft = buffer_get_size(dest) - destpos;

	/* no translation needed - just copy it to outbuf uppercased */
	size = buffer_get_used_size(src);
	if (size > destleft)
		size = destleft;
	_charset_utf8_ucase(buffer_get_data(src, NULL), size, dest, destpos);
	if (src_pos != NULL)
		*src_pos = size;
	return CHARSET_RET_OK;
}

const char *
charset_to_ucase_utf8_string(const char *charset, int *unknown_charset,
			     const Buffer *data, size_t *utf8_size)
{
	if (charset == NULL || strcasecmp(charset, "us-ascii") == 0 ||
	    strcasecmp(charset, "ascii") == 0 ||
	    strcasecmp(charset, "UTF-8") == 0 ||
	    strcasecmp(charset, "UTF8") == 0) {
		if (unknown_charset != NULL)
			*unknown_charset = FALSE;
		return _charset_utf8_ucase_strdup(data, utf8_size);
	} else {
		if (unknown_charset != NULL)
			*unknown_charset = TRUE;
		return NULL;
	}
}

#endif