Main Page | Class List | File List | Class Members | File Members | Related Pages

ut_conversion.c File Reference

Conversion functions from one charset to another. More...

#include <stdlib.h>
#include <stdio.h>
#include "utrac.h"
#include "debug.h"

Include dependency graph for ut_conversion.c:

Include dependency graph

Go to the source code of this file.

Functions

bool is_ext (char c)
 Test if c is an extended character.
int ut_size_unicode (ulong unicode)
 Return the size in byte of an Unicode character in UTF-8.
ulong ut_utf8c_to_unicode (char **src_p)
 Convert an UTF-8 character to Unicode scalar value.
void ut_unicode_to_utf8c (ulong unicode, char **dst_p)
 Convert an Unicode scalar value to UTF-8 character.
int ut_size_char (char **src_p, UtCharsetIndex src_charset, UtCharsetIndex dst_charset)
 Return size in byte of a character after conversion.
void ut_conv_char (char **src_p, char **dst_p, UtCharsetIndex src_charset, UtCharsetIndex dst_charset)
 Convert a character.
void ut_insert_eol (char **dst_p, UtEolType dst_eol)
uint ut_count_ext_char (UtText *text)
 Count the number of extended character in a text.
int ut_size_difference (UtText *src_text, UtText *dst_text)
 Return the difference between the size of a text and its size after conversion.
UtCode ut_conversion_pass (UtText *src_text, UtText *dst_text)
 Convert extended characters and EOL.


Detailed Description

Conversion functions from one charset to another.

Todo:
EC les fonction inline be fonctionne qu'avec gcc !! il faudrait mettre une macro UT_INLINE dans un header. AC "inline" est pourtant posix, non?

ASSERT sur tous les parametres.

Definition in file ut_conversion.c.


Function Documentation

void ut_conv_char char **  src_p,
char **  dst_p,
UtCharsetIndex  src_charset,
UtCharsetIndex  dst_charset
 

Convert a character.

Parameters:
text UtText structure containing the source charset and the destination charset.
src_p Address of the pointer on the beginning of the character encoded with the source charset . This pointer will be incremented to the beginning of the following character.
dst_p address of the pointer on the buffer where the converted character will be written. This pointer is incremented to the end of the character + 1 after conversion.

Todo:
EC Il y a des cas d'erreur (ERROR), on doit donc pourvoir retourner l'erreur. AC Les erreurs sont gérées : elles sont indiquées par un 'ut_session->nomapping_char' dans le texte.

Definition at line 259 of file ut_conversion.c.

References UtSession::charset, UtSession::charset_default, UtSession::nomapping_char, UtCharset::type, UtCharset::unicode, ut_unicode_to_utf8c(), UT_UNSET, and ut_utf8c_to_unicode().

Referenced by ut_conversion_pass().

Here is the call graph for this function:

UtCode ut_conversion_pass UtText src_text,
UtText dst_text
 

Convert extended characters and EOL.

The conversion consists to :

  • remove skip characters,
  • change null characters to EOL tpye specified in UtText::dst_eol,
  • change extended characters encoded with UtText::src_charset to UtText::dst_charset encoding.

Parameters:
text UtText to convert. Updates UtText::data and UtText::size.
Returns:
UT_OK on success, error code otherwise.

Definition at line 539 of file ut_conversion.c.

References UtText::charset, UtText::data, UtText::eol, UtText::eol_alt, is_ext(), UtSession::progress_function, UtText::size, ut_conv_char(), ut_count_ext_char(), UT_PROCESS_STEP, ut_size_difference(), and ut_update_progress().

Referenced by ut_convert().

Here is the call graph for this function:

int ut_size_char char **  src_p,
UtCharsetIndex  src_charset,
UtCharsetIndex  dst_charset
 

Return size in byte of a character after conversion.

Parameters:
text UtText structure containing the source charset and the destination charset.
src_p Address of the pointer on the beginning of the character encoded with the source charset . This pointer will be incremented to the beginning of the following character.
Returns:
The size of the character when it will be encoded with the destination charset.
Warning:
Il n'y a pas de return final !
Bug:
AC voir ut_size_unicode() quand retour = 0

Definition at line 203 of file ut_conversion.c.

References UtSession::charset, UtSession::charset_default, UtSession::nomapping_char, UtCharset::type, UtCharset::unicode, ut_size_unicode(), UT_UNSET, and ut_utf8c_to_unicode().

Here is the call graph for this function:

int ut_size_difference UtText src_text,
UtText dst_text
 

Return the difference between the size of a text and its size after conversion.

Parameters:
text UtText structure containing the text, the source and the destination charsets
Returns:
The size difference. If value is negative, the text will be smaller, if positive, the text will be bigger.

Todo:
EC Cette fonction ne retourne pas de code d'erreur alors qu'il y a des ERROR() et que de mauvais paramètres doivent pouvoir la faire pantée. Il faut donc mettre en parametre un pointeur sur la variable à fixer (ou l'intégrer dans UtText) et mettre le type de retour à UtCode. AC Effectivement, bien qu'il s'agisse alors d'erreurs dues à une mauvaise utilisation de l'API.

Bug:
AC voir ut_size_unicode() quand retour = 0

Definition at line 363 of file ut_conversion.c.

References UtText::charset, UtSession::charset, UtText::distribution, UtText::eol, UtText::eol_alt, UtText::nb_lines, UtText::nb_lines_alt, UtSession::nomapping_char, UtCharset::type, UtCharset::unicode, ut_count_ext_char(), UT_EOL_BSN, UT_EOL_MIX, UT_EOL_NUL, ut_size_unicode(), and UT_UNSET.

Referenced by ut_conversion_pass().

Here is the call graph for this function:

int ut_size_unicode ulong  unicode  ) 
 

Return the size in byte of an Unicode character in UTF-8.

  • UTF-8 on 1 byte: 0000 0000 0xxx xxxx => 0xxx xxxx
  • UTF-8 on 2 bytes: 0000 0yyy yyxx xxxx => 110y yyyy 10xx xxxx
  • UTF-8 on 3 bytes: zzzz yyyy yyxx xxxx => 1110 zzzz 10yy yyyy 10xx xxxx
  • UTF-8 on 4 bytes: 00uu uuzz zzzz yyyy yyxx xxxx => 1111 0uuu 10zz zzzz 10yy yyyy 10xx xxxx

Parameters:
unicode The scalar value of the Unicode character.
Returns:
Size in byte.

Bug:
EC Il n'y a pas de gestion de l'ordre des octets dans le long, ceci ne fonctionne donc pas sous mac (à moins que cela soit fait en amont ?). AC On teste ici la valeur scalaire, c'est à dire un long et rien d'autre, donc pas de prb d'endian.

EC Que ce passe-t-il si unicode>0x10FFFF ? La fonction renvoi 0... si la fonction appelant ne le test pas, on obtiendra une boucle sans fin. Il vaut mieux un programme qui plante qu'un programme qui freeze, la valeur 0 n'est donc pas indiquée. AC Pas de freeze possible! Par contre les carctères illégaux peuvent être remplacé par un carctère au choix de l'utilisateur, il faudrait donc renvoyer la taille de ce caractère d'erreur, afin qu'un éventuel malloc ne soit pas trop court. Mais il faudrait peut être plutôt gérer ça dans les autres fonctions pour ne pas avoir à rajouter une structure UtText en argument.

Note:
EC Ce code étant extraimement simple et concis, il serait surement interressant de le mettre en inline. De plus si ce code est beaucoup utilisé, on peut faire quelques optimisations (test < == > sur 0xFFFF si le premier test échoue permettrait 1 à 2 tests à la place de 1 à 4 tests par exemple). AC Pour l'inline, oui, mais la fonction n'est pas appelé si souvent que ça. Pour l'organisation des tests, les cas les plus fréquents (pour du latin) sont le cas 1, puis le 2, puis le 3 etc... donc tests bien ordonnés.

Definition at line 82 of file ut_conversion.c.

Referenced by ut_size_char(), and ut_size_difference().

void ut_unicode_to_utf8c ulong  unicode,
char **  dst_p
 

Convert an Unicode scalar value to UTF-8 character.

Parameters:
dst_p address of the pointer on the buffer where the character is going to be written. This pointer is incremented to the end of the character + 1 after conversion.
unicode Unicode scalar value of the character to convert.

Bug:
EC il y a des cas d'erreur, donc il faut un retour, si l'on tombe dans le cas d'erreur vu qu'il n'y a plus d'incrémentation de dst_p on risque une boucle sans fin. AC Pas de boucle sans fin, et erreur peu grave.
Note:
EC une fonction inline serait peut être la bien venue. AC vrai, il faudrait mettre la fonction dans un include...

Definition at line 170 of file ut_conversion.c.

Referenced by ut_conv_char().

ulong ut_utf8c_to_unicode char **  src_p  ) 
 

Convert an UTF-8 character to Unicode scalar value.

Parameters:
src_p address of the pointer on the beginning of the character. This pointer is incremented to the beginning of the following character after conversion.
Returns:
Unicode scalar value of the converted character.

Bug:
EC Dans le cas d'un caractère invalide, si c'est le premier il est comptabilisé, mais si ce n'est pas le premier, il ne l'est pas. C'est vraiment ce que l'on veut ? AC ??? Si il est compatibilisé! (voir "while (size--) {...}")

=10xx xxxx

Definition at line 114 of file ut_conversion.c.

References ut_print_binary().

Referenced by ut_conv_char(), and ut_size_char().

Here is the call graph for this function:


Generated on Fri Feb 25 18:30:16 2005 for Utrac by  doxygen 1.3.9