Rizin
unix-like reverse engineering framework and cli tools
rz_punycode.h File Reference
#include <rz_types.h>

Go to the source code of this file.

Functions

RZ_API char * rz_punycode_encode (const ut8 *src, int srclen, int *dstlen)
 
RZ_API char * rz_punycode_decode (const char *src, int srclen, int *dstlen)
 

Function Documentation

◆ rz_punycode_decode()

RZ_API char* rz_punycode_decode ( const char *  src,
int  srclen,
int dstlen 
)

Definition at line 255 of file punycode.c.

255  {
256  const char *p;
257  ut32 si, di;
258  ut32 b, n, t, i, k, w;
259  ut32 digit, org_i, bias;
260  ut32 *dst = NULL;
261  ut8 *finaldst = NULL;
262 
263  *dstlen = 0;
264  if (!src || srclen < 1) {
265  return NULL;
266  }
267 
268  dst = calloc(2 * srclen + 10, 4);
269  if (!dst) {
270  return NULL;
271  }
272 
273  for (si = 0; si < srclen; si++) {
274  if (src[si] & 0x80) {
275  free(dst);
276  return NULL; /*just return it*/
277  }
278  }
279 
280  for (p = src + srclen - 1; p > src && *p != '-'; p--) {
281  ;
282  }
283  b = p - src;
284 
285  di = b;
286  for (i = 0; i < di; i++) {
287  dst[i] = src[i];
288  }
289 
290  i = 0;
291  n = INITIAL_N;
292  bias = INITIAL_BIAS;
293 
294  for (si = b + (b > 0); si < srclen; di++) {
295  org_i = i;
296 
297  for (w = 1, k = BASE;; k += BASE) {
298  digit = decode_digit(src[si++]);
299 
300  if (digit == UT32_MAX) {
301  free(dst);
302  return NULL;
303  }
304 
305  if (digit > (UT32_MAX - i) / w) {
306  free(dst);
307  return NULL;
308  }
309 
310  i += digit * w;
311 
312  if (k <= bias) {
313  t = TMIN;
314  } else if (k >= bias + TMAX) {
315  t = TMAX;
316  } else {
317  t = k - bias;
318  }
319 
320  if (digit < t) {
321  break;
322  }
323 
324  if (w > UT32_MAX / (BASE - t)) {
325  free(dst);
326  return NULL;
327  }
328 
329  w *= BASE - t;
330  }
331 
332  bias = adapt_bias(i - org_i, di + 1, org_i == 0);
333 
334  if (i / (di + 1) > UT32_MAX - n) {
335  free(dst);
336  return NULL;
337  }
338 
339  n += i / (di + 1);
340  i %= (di + 1);
341 
342  memmove(dst + i + 1, dst + i, (di - i) * sizeof(ut32));
343  dst[i++] = n;
344  }
345 
346  finaldst = utf32toutf8(dst);
347  free(dst);
348  if (finaldst) {
349  *dstlen = strlen((const char *)finaldst);
350  } else {
351  eprintf("ERROR: finaldst is null\n");
352  return NULL;
353  }
354  return (char *)finaldst;
355 }
si
lzma_index ** i
Definition: index.h:629
lzma_index * src
Definition: index.h:567
#define NULL
Definition: cris-opc.c:27
#define w
Definition: crypto_rc6.c:13
uint32_t ut32
const char * k
Definition: dsignal.c:11
RZ_API void Ht_() free(HtName_(Ht) *ht)
Definition: ht_inc.c:130
uint8_t ut8
Definition: lh5801.h:11
void * p
Definition: libc.cpp:67
void * calloc(size_t number, size_t size)
Definition: malloc.c:102
char * dst
Definition: lz4.h:724
int n
Definition: mipsasm.c:19
#define INITIAL_BIAS
Definition: punycode.c:13
ut32 adapt_bias(ut32 delta, unsigned n_points, int is_first)
Definition: punycode.c:112
#define INITIAL_N
Definition: punycode.c:12
#define BASE
Definition: punycode.c:7
static ut32 decode_digit(ut32 v)
Definition: punycode.c:163
#define TMAX
Definition: punycode.c:9
#define TMIN
Definition: punycode.c:8
ut8 * utf32toutf8(ut32 *input)
Definition: punycode.c:23
#define eprintf(x, y...)
Definition: rlcc.c:7
#define UT32_MAX
Definition: rz_types_base.h:99
#define b(i)
Definition: sha256.c:42

References adapt_bias(), b, BASE, calloc(), decode_digit(), dst, eprintf, free(), i, INITIAL_BIAS, INITIAL_N, k, n, NULL, p, si, src, TMAX, TMIN, UT32_MAX, utf32toutf8(), and w.

Referenced by update().

◆ rz_punycode_encode()

RZ_API char* rz_punycode_encode ( const ut8 src,
int  srclen,
int dstlen 
)

Definition at line 176 of file punycode.c.

176  {
177  ut32 m, n;
178  ut32 b, h;
179  ut32 si, di;
180  ut32 delta, bias;
181  ut32 *actualsrc = NULL;
182  ut32 len = 0;
183  char *dst = NULL;
184 
185  *dstlen = 0;
186 
187  if (!src || srclen < 1) {
188  return NULL;
189  }
190 
191  actualsrc = utf8toutf32(src, srclen);
192  if (!actualsrc) {
193  return NULL;
194  }
195 
196  len = utf32len(actualsrc);
197 
198  dst = calloc(2 * len + 10, 1);
199  if (!dst) {
200  free(actualsrc);
201  return NULL;
202  }
203 
204  for (si = 0, di = 0; si < len; si++) {
205  if (actualsrc[si] < 128) {
206  dst[di++] = actualsrc[si];
207  }
208  }
209 
210  b = h = di;
211 
212  if (di > 0) {
213  dst[di++] = '-';
214  }
215 
216  n = INITIAL_N;
217  bias = INITIAL_BIAS;
218 
219  for (delta = 0; h < len; n++, delta++) {
220  for (m = UT32_MAX, si = 0; si < len; si++) {
221  if (actualsrc[si] >= n && actualsrc[si] < m) {
222  m = actualsrc[si];
223  }
224  }
225 
226  if ((m - n) > (UT32_MAX - delta) / (h + 1)) {
227  free(actualsrc);
228  free(dst);
229  return NULL;
230  }
231 
232  delta += (m - n) * (h + 1);
233  n = m;
234 
235  for (si = 0; si < len; si++) {
236  if (actualsrc[si] < n) {
237  if (++delta == 0) {
238  free(actualsrc);
239  free(dst);
240  return NULL;
241  }
242  } else if (actualsrc[si] == n) {
243  di += encode_var_int(bias, delta, &dst[di]);
244  bias = adapt_bias(delta, h + 1, h == b);
245  delta = 0;
246  h++;
247  }
248  }
249  }
250  *dstlen = di;
251  free(actualsrc);
252  return dst;
253 }
size_t len
Definition: 6502dis.c:15
ut32 * utf8toutf32(const ut8 *input, int len)
Definition: punycode.c:68
static ut32 encode_var_int(const ut32 bias, const ut32 delta, char *dst)
Definition: punycode.c:133
int utf32len(ut32 *input)
Definition: punycode.c:15
#define h(i)
Definition: sha256.c:48
static st64 delta
Definition: vmenus.c:2425

References adapt_bias(), b, calloc(), delta, dst, encode_var_int(), free(), h, INITIAL_BIAS, INITIAL_N, len, regress::m, n, NULL, si, src, UT32_MAX, utf32len(), and utf8toutf32().

Referenced by update().