Browse Source

* torrent2json now generates hex: strings if control chars seen

master
Alex 'AdUser' Z 9 years ago
parent
commit
7adf209d25
  1. 38
      src/torrent2json.c

38
src/torrent2json.c

@ -29,6 +29,34 @@ Where options are:\n\
exit(exitcode); exit(exitcode);
} }
void
hexencode(unsigned char *buf, unsigned int len) {
unsigned char *encbuf = NULL;
unsigned int enclen = sizeof(char) * (len * 3 + 3); /* "hex" + "FF," x len */
unsigned int i, j;
unsigned int a, b;
if ((encbuf = malloc(enclen)) == NULL) {
fprintf(stderr, "Can't allocate memory, exiting.\n");
exit(EXIT_FAILURE);
}
memcpy(encbuf, "hex", 3);
for (i = 0, j = 3; i < len; i++, j += 3) {
a = (buf[i] & 0xF0) >> 4;
b = (buf[i] & 0x0F) >> 0;
encbuf[j + 0] = ',';
encbuf[j + 1] = (a > 9) ? 'A' + (a - 10) : '0' + a;
encbuf[j + 2] = (b > 9) ? 'A' + (b - 10) : '0' + b;
}
encbuf[3] = ':';
yajl_gen_string(gen, encbuf, enclen);
free(encbuf);
}
/* handlers */ /* handlers */
void void
get_integer(int chr) get_integer(int chr)
@ -75,6 +103,7 @@ get_string(int chr)
int c = '\0'; int c = '\0';
unsigned int i = 0; unsigned int i = 0;
unsigned char *buf = NULL; unsigned char *buf = NULL;
unsigned int hex = 0;
/* first, get string lenght */ /* first, get string lenght */
while (isdigit((c = fgetc(in)))) while (isdigit((c = fgetc(in))))
@ -88,10 +117,17 @@ get_string(int chr)
} }
memset(buf, '\0', sizeof(char) * (len + 1)); memset(buf, '\0', sizeof(char) * (len + 1));
for (i = 0; i < len; i++) for (i = 0; i < len; i++) {
buf[i] = fgetc(in); buf[i] = fgetc(in);
if (buf[i] < 0x20) /* string has control chars */
hex = 1;
}
if (hex == 1) {
hexencode(buf, len);
} else {
yajl_gen_string(gen, buf, len); yajl_gen_string(gen, buf, len);
}
free(buf); free(buf);
} }

Loading…
Cancel
Save