char* str_compress(const char* decompressed_string) {
char* compressed_string = malloc(ceil((strlen(decompressed_string)*5/8)+1)+1);
for (int i = 0;i < strlen(compressed_string)+1;i++) {
compressed_string[i] = 0;
}
for (int i = 0;i < strlen(decompressed_string)+1;i++) {
if ((i*5/8) == (((i*5)+4)/8)) {
compressed_string[i*5/8] |= ((decompressed_string[i] & 31) << (3-((i*5) % 8)));
} else {
compressed_string[i*5/8] |= (decompressed_string[i] & 31) >> (((i*5) % 8)-3);
compressed_string[(i+1)*5/8] |= (decompressed_string[i] & 31) << (11-((i*5) % 8));
}
}
return compressed_string;
}
char* str_format_and_compress(const char* original_decompressed_string) {
unsigned int decompressed_length = strlen(original_decompressed_string)+1;
char* decompressed_string = malloc(decompressed_length);
strcpy(decompressed_string,original_decompressed_string);
for (int i = 0;i < decompressed_length;i++) {
if (decompressed_string[i] == 32) decompressed_string[i] = 27;
else if (decompressed_string[i] == 45) decompressed_string[i] = 28;
}
char* compressed_string = malloc(ceil((decompressed_length*5/8)+1)+1);
unsigned int compressed_length = strlen(compressed_string)+1;
for (int i = 0;i < compressed_length+1;i++) {
compressed_string[i] = 0;
}
for (int i = 0;i < decompressed_length+1;i++) {
if ((i*5/8) == (((i*5)+4)/8)) {
compressed_string[i*5/8] |= ((decompressed_string[i] & 31) << (3-((i*5) % 8)));
} else {
compressed_string[i*5/8] |= (decompressed_string[i] & 31) >> (((i*5) % 8)-3);
compressed_string[(i+1)*5/8] |= (decompressed_string[i] & 31) << (11-((i*5) % 8));
}
}
free(decompressed_string);
return compressed_string;
}
char* str_decompress(const char* compressed_string) {
unsigned int decompressed_length = (strlen(compressed_string)+1)*1.6;
char* decompressed_string = malloc(decompressed_length);
for (int i = 0;i < decompressed_length;i++) {
decompressed_string[i] = 0;
}
for (int i = 0;i < decompressed_length;i++) {
if ((i*5/8) == (((i*5)+4)/8)) {
decompressed_string[i] |= ((compressed_string[i*5/8] & 255) >> (3-((i*5) % 8))) & 31;
} else {
decompressed_string[i] |= (((compressed_string[i*5/8] & 255) << (((i*5) % 8)-3)) & 31) | (((compressed_string[(i+1)*5/8] & 255) >> (11-((i*5) % 8))) & 31);
}
}
return decompressed_string;
}
char* str_decompressed_format(char* decompressed_string) {
unsigned int strlength = strlen(decompressed_string);
for (int i = 0;i < strlength;i++) {
if (decompressed_string[i] < 27) decompressed_string[i] += 96;
else if (decompressed_string[i] == 27) decompressed_string[i] = 32;
else if (decompressed_string[i] == 28) decompressed_string[i] = 45;
else decompressed_string[i] += 64;
}
decompressed_string[0] -= 32;
for (int i = 1;i < strlength;i++) {
if (decompressed_string[i-1] == 32 || decompressed_string[i-1] == 45 || decompressed_string[i-1] == 95) decompressed_string[i] -= 32;
}
return decompressed_string;
}
char* str_decompress_and_format(const char* compressed_string) {
char* decompressed_string = malloc((strlen(compressed_string)+1)*1.6);
for (int i = 0;i < strlen(decompressed_string)+1;i++) {
decompressed_string[i] = 0;
}
for (int i = 0;i < strlen(decompressed_string)+1;i++) {
if ((i*5/8) == (((i*5)+4)/8)) {
decompressed_string[i] |= ((compressed_string[i*5/8] & 255) >> (3-((i*5) % 8))) & 31;
} else {
decompressed_string[i] |= (((compressed_string[i*5/8] & 255) << (((i*5) % 8)-3)) & 31) | (((compressed_string[(i+1)*5/8] & 255) >> (11-((i*5) % 8))) & 31);
}
}
unsigned int strlength = strlen(decompressed_string);
for (int i = 0;i < strlength;i++) {
if (decompressed_string[i] < 27) decompressed_string[i] += 96;
else if (decompressed_string[i] == 27) decompressed_string[i] = 32;
else if (decompressed_string[i] == 28) decompressed_string[i] = 45;
else decompressed_string[i] += 64;
}
decompressed_string[0] -= 32;
for (int i = 1;i < strlength;i++) {
if (decompressed_string[i-1] == 32 || decompressed_string[i-1] == 45 || decompressed_string[i-1] == 95) decompressed_string[i] -= 32;
}
return decompressed_string;
}