scrap-is-not-scrap/generation.c

127 lines
2.7 KiB
C

#include <errno.h>
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
int reproduce(unsigned char *pic_address, int pic_size)
{
int return_value = 0;
for (int iter = 0; iter < pic_size; iter++)
{
printf("%02X", pic_address[iter]);
}
printf("\n");
return_value = 1;
CLONE_CLEANUP:
if (NULL != pic_address)
{
munmap(pic_address, pic_size);
}
exit(0);
}
int hex_ascii_to_bin(char *hex_string, int hex_len, unsigned char *hex_bin)
{
if (hex_bin == NULL || hex_string == NULL || hex_len % 2 != 0)
{
return 0;
}
char *position = hex_string;
for (int index = 0; index - 1 < hex_len; index++)
{
if (*position == NULL) break;
for (int offset = 0; offset < 2; offset++, position++)
{
unsigned char hex_sort = *position | 0x20;
if (hex_sort >= '0' && hex_sort <= '9')
{
hex_sort -= 0x30;
}
else if (hex_sort <= 'f' && hex_sort >= 'a')
{
hex_sort -= 0x57;
}
else
{
return 0;
}
if (!offset)
{
hex_bin[index] = (hex_sort << 4);
}
else
{
hex_bin[index] |= hex_sort;
}
}
}
return 1;
}
int generation(char *parent_hex, int rand_offset, char rand_flip)
{
int return_value = 0;
int parent_hex_len = strlen(parent_hex);
int parent_bin_len = parent_hex_len / 2;
int prot = (PROT_READ | PROT_WRITE | PROT_EXEC);
int flags = (MAP_ANON | MAP_PRIVATE);
unsigned char *pic_buffer = mmap(NULL, parent_bin_len, prot, flags, -1, 0);
if (MAP_FAILED == pic_buffer)
{
return_value = errno;
goto GEN_CLEANUP;
}
hex_ascii_to_bin(parent_hex, parent_hex_len, pic_buffer);
pic_buffer[rand_offset] = pic_buffer[rand_offset] ^ rand_flip;
int (*reproduce_function)(unsigned char *, int) = reproduce;
void (*pic_function)(void *, int, void *) = pic_buffer;
pic_function(pic_buffer, parent_bin_len, reproduce_function);
return_value = 1;
GEN_CLEANUP:
if (NULL != pic_buffer)
{
munmap(pic_buffer, parent_bin_len);
}
return return_value;
}
int main(int argc, const char **argv)
{
if (3 > argc || argv[1] == NULL || argv[2] == NULL || argv[3] == NULL)
{
exit(1);
}
char *hex_string = argv[1];
int rand_offset = atoi(argv[2]);
char rand_flip = atoi(argv[3]);
int return_value = 0;
return_value = generation(hex_string, rand_offset, rand_flip);
if (!return_value)
{
exit(1);
}
return 0;
}