// alphaint.h
// Library functions for alphabetical ordering of UTF-8 and ANSI strings
// Writed by Francisco Lloret López-Nieto, e-mail: pcmstr@terra.es
// Distributed under GPL version 2 license or any later version

// Letters. Thesse codes are valid in both ANSI and UTF-8 codes,
// but in  UTF-8 it can be stored in two bytes.

#ifndef ALPHAINT_H
#define ALPHAINT_H

#define ALO 224 // lowercase a with open accent
#define ALC 225 // lowercase a with closed accent
#define ALF 226 // lowercase a with circumflex accent
#define ALT 227 // lowercase a with tilde
#define ALD 228 // lowercase a with dieresis
#define ALL 229 // lowercase a with little o
#define AUO 192 // uppercase a with open accent
#define AUC 193 // uppercase a with closed accent
#define AUF 194 // uppercase a with circumflex accent
#define AUT 195 // uppercase a with tilde
#define AUD 196 // uppercase a with dieresis
#define AUL 197 // uppercase a with little o
#define ELO 232 // lowercase e with open accent
#define ELC 233 // lowercase e with closed accent
#define ELF 234 // lowercase e with circumflex accent
#define ELD 235 // lowercase e with dieresis
#define EUO 200 // uppercase e with open accent
#define EUC 201 // uppercase e with closed accent
#define EUF 202 // uppercase e with circumflex accent
#define EUD 203 // uppercase e with dieresis
#define ILO 236 // lowercase i with open accent
#define ILC 237 // lowercase i with closed accent
#define ILF 238 // lowercase i with circumflex accent
#define ILD 239 // lowercase i with dieresis
#define IUO 204 // uppercase i with open accent
#define IUC 205 // uppercase i with closed accent
#define IUF 206 // uppercase i with circumflex accent
#define IUD 207 // uppercase i with dieresis
#define OLO 242 // lowercase o with open accent
#define OLC 243 // lowercase o with closed accent
#define OLF 244 // lowercase o with circumflex accent
#define OLT 245 // lowercase o with tilde
#define OLD 246 // lowercase o with dieresis
#define OUO 210 // uppercase o with open accent
#define OUC 211 // uppercase o with closed accent
#define OUF 212 // uppercase o with circumflex accent
#define OUT 213 // uppercase o with tilde
#define OUD 214 // uppercase o with dieresis
#define ULO 249 // lowercase u with open accent
#define ULC 250 // lowercase u with closed accent
#define ULF 251 // lowercase u with circumflex accent
#define ULD 252 // lowercase u with dieresis
#define UUO 217 // uppercase u with open accent
#define UUC 218 // uppercase u with closed accent
#define UUF 219 // uppercase u with circumflex accent
#define UUD 220 // uppercase u with dieresis
#define YLC 253 // lowercase y with closed accent
#define YUC 221 // uppercase y with closed accent
#define  NL 241 // lowercase n with tilde 
#define  NU 209 // uppercase n with tilde
#define  CL 231 // lowercase cedilla
#define  CU 199 // uppercase cedilla


// Character encodings
#define UTF8 0
#define ANSI 1


// Comparation functions
#define EQUAL_TO 0
#define LESS_THAN 1
#define GREATER_THAN 2


size_t UTF8long (char *s, char encoding);
// Returns size in caracteres (not bytes) of a UTF-8 or ANSI string

char NumBytes (char *s, char encoding);
// Return number of bytes needed by an UTF-8 o ANSI string (if ANSI always 1)

int UTFvalid (char *s);
// Test if a string contains a valid UTF-8 sequence.

char PutChar (char *s, int c, char encoding);
// Insert a UTF-8 or ANSI char in a string, and returns the number of bytes used.

void UpperCase (char *s, char encoding);
// Changes to upcase the first character in an UTF-8 o ANSI string

void LowerCase (char *s, char encoding);
// Changes to lowercase the first character in an UTF-8 o ANSI string

void StringToUpper (char *s, char encoding);
// Converts to uppercase an UTF-8 or ANSI string

void StringToLower (char *s, char encoding);
// Converts to lowercase an UTF-8 o ANSI string

void EraseAccents (char *s, char *e, char encoding);
// Copy e in s, changing extended vocals with normal vocals: ex. á -> a

void convert (char *ss, char *se, char *temp, char encoding, char mode);
// Change letter codes to allow alphabetical ordering instead of ANSI ordering

int max (int a, int b);

int AlphaComp (char *a, char *b, char encoding, char cond);
// Compares two strings

#endif // ALPHAINT_H
