-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcomun.hpp
282 lines (233 loc) · 6.52 KB
/
comun.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
/** @file comun.hpp
* Datos comunes.
*
* @package Mt77
* @author Vladimir Támara Patiño. [email protected]
* Dominio público. 2008. Sin garantías
* http://creativecommons.org/licenses/publicdomain/
* @version $Id: comun.hpp,v 1.11 2010/01/18 16:12:50 vtamara Exp $
*/
#if !defined(Comun_hpp)
#define Comun_hpp
#include <set>
#include <string>
#include <ostream>
#include <sstream>
#include <iomanip>
#include <stdint.h>
#ifdef ASSERT
#undef ASSERT
#endif
#ifdef NDEBUG
#define ASSERT(x) ((void)0)
#warning NDEBUG activo compilando sin ASSERT
#else
#define ASSERT(x) \
if (! (x)) \
{ \
stringstream _sa; _sa.clear(); _sa.str(""); \
_sa << __FILE__ << ":" << __LINE__ << "Falló aserción " << #x << " \n"; \
throw std::string(_sa.str()); \
}
#endif
/** Máxima longitud de un URL --de documentaos indexables */
const uint32_t MAXLURL = 1024;
/** Máxima longitud de un condensado */
const uint32_t MAXLCONDENSADO = 64;
/** Máxima longitud de un hexadecimal. Usado por lo menos en
* indice de documento en posición, posiciones dentro del índice. */
const uint32_t MAXLHEX = 8;
/** Máxima longitud de un 128b (número en base 128). Por usar en
* índice de documento, posición, ``apuntadores'' al archivo
*/
const int MAXL128B = 5;
/**
* Máxima longitud de un número en formato escogido para archivo
**/
const int MAXLNUMERO = MAXL128B;
/** Máxima longitud de un decimal. Empleado por lo menos para
* indexar documentos referenciados por un índice. */
const int MAXLDEC = 10;
/** Tamaño máximo de una cadena indexable */
const uint32_t MAXCAD = 32;
using namespace std;
/** Marca en índice */
const string MARCAIND = "Mt77:\xedndiceP6";
/** Marca en relación de documentos */
const string MARCAREL = "Mt77:relaci\xf3nP6";
/** Caracter que marca final de una cadena en archivo */
const char FINCADENA = '{';
/**
* Verifica nombre de índice, y genera nombre de relación de documentos
* asociada
* @param na Nombre de índice
* @param nrel con espacio para MAXLURL caracteres, retorna nombre de rel.
*/
void verificaNombre(const char *na, char *nrel) noexcept(false);
/**
* Formatea un conjunto a un flujo de salida
* @param os Flujo de sálida
* @param c Conjunto
* @return El mismo flujo de sálida recibido pero tras envíar una represntación
* plan del conjunto
*/
template <class T>
std::ostream &
operator<<(std::ostream &os, set<T> c)
{
os <<"{";
typename set<T>::iterator i;
string sep = "";
for (i = c.begin(); i != c.end(); i++) {
os << sep << *i;
sep = ", ";
}
os <<"}";
return os;
}
/**
* Retorna el prefijo común más largo de dos cadenas
* @param a Primera cadena
* @param b Segunda cadena
**/
string prefijo_comun_mas_largo(string a, string b);
/**
* Retorna cadena de error con posición de is
* @param is Flujo de entrada
* @param m Cadena con error
* @return Cadena con mensaje de error precedido de posición en is
**/
std::string errorFormato(std::istream &is, string m);
/**
* Lee una cadena
* @param is flujo de entrada
**/
string leeCad(istream &is) noexcept(false);
/**
* Lee un número hexadecimal
* @param is flujo de entrada
**/
long leeHex(std::istream &is) noexcept(false);
/**
* Escribe en os un entero como hexadecimal de 8 digitos.
* @param os Flujo de salida
* @param n Número por escribir como hexadecimla de 8 dígitos
**/
void escribeHex(std::ostream &os, uint32_t n);
/**
* Lee un número en base 128.
* Cada digito es un caracter entre '0' (ASCII 48) y el de ASCII 175.
* Con 5 dígitos de estos puede representarse más de 4294967295 = 0xFFFFFFFF
* @param is flujo de entrada
**/
long lee128b(std::istream &is) noexcept(false);
/**
* Escribe en os un entero en base 128.
* @see lee128b
* @param os Flujo de salida
* @param n Número por escribir en base 128
**/
void escribe128b(std::ostream &os, uint32_t n);
/**
* Convierte número a cadena en base 128b
* @see lee128b
* @param n Número por retornar
*/
string n128b_c(uint32_t n);
/**
* Convierte número en base 128 a entero
* @see lee128b
* @param s Cadena con númro en base 128
*/
uint32_t c_n128b(string s);
/**
* Retorna longitud de un número en base 128
* @param n número
*
* @return longitud
*/
inline uint32_t
long128b(uint32_t n)
{
return MAXL128B;
}
/**
* Lee un número en formato escogido para desplazamientos
* @param is flujo de entrada
**/
inline uint32_t
leeNDesp(std::istream &is) noexcept(false)
{
return lee128b(is);
}
/**
* Escribe un número en el formato escogido para desplazamientos
* @param os Flujo de salida
* @param n Número por escribir
**/
inline void
escribeNDesp(std::ostream &os, uint32_t n)
{
escribe128b(os, n);
}
/**
* Retorna longitud del número n al escribirlo con escribeNDesp
*/
inline uint32_t
longNDesp(uint32_t n)
{
return MAXL128B;
}
/**
* Normaliza primer caracter de cadena en UTF-8
* @param c Cadena cuyo primer caracter se normaliza
* @param inc Cantidad de bytes de primer caracter normalizado
* @return Cadena que corresponde a primer caracter de c normalizado
* (tipicamente mayúscula o vacío)
*/
string normalizaCaracter(string c, int &inc);
/**
* Normaliza cadena
* @param s Cadena por normalizar
* @param latin1 Indica si c está en codificación LATIN1 dlc es UTF-8
* @return Cadena normalizada y convertida a UTF-8 si hacía falta
**/
string normaliza(string s, bool latin1 = false);
/**
* Convierte primer caracter de cadena u8 con codificación UTF-8 al
* caracter que le corresponde en codificación latin1.
* Inspirado en
* - utf8_decode de
* http://svn.apache.org/repos/asf/stdcxx/branches/4.1.3/util/charmap.cpp
* - latin1_toUtf8 de expat
*
* @param u8 Cadena en UTF-8
* @param latin1 Caracter de salida
* @return Cantidad de bytes leidos de u8 para la conversión
*/
int car_utf8_a_latin1(const char *u8, char *latin1);
/**
* Convierte cadena u8 con codificación UTF-8 a latin 1 (ISO8859-1).
*
* @param u8 Cadena en UTF-8
* @param len Longitud de u8
* @return Cadena convertida
*
*/
string utf8_a_latin1(const char *u8, int len);
/**
* Divide una cadena de acuerdo a un delimitador
* @param delimitador subcadena que marca donde dividir
* @param cad Cadena por dividir
*
* @return Vector de subcadenas
*/
vector<string> estalla(const string &delimitador, const string &cad);
/**
* Crea un directorio temporal y retorna su nombre.
* Basado en pagina man de mktemp.
* @return Ruta del directorio temporal
*/
string directorio_temp();
string cadena_latin1_a_utf8(string str);
#endif