#include #include #include #include #include #include #define UNUSED(x) ((void) (x)) #define ALLOCATION_CHUNK (10UL) enum { NORMAL, BOLD, DARKNESS, ITALIC, UNDERLINE, BLINK, DUNNO_6, REVERSE, INVISIBLE }; enum { GREY, RED, GREEN, YELLOW, BLUE, PINK, CYAN, WHITE, CANCEL }; static char * buffer = NULL; static size_t buffer_size = 0; static void render_character(char * character) { write(STDOUT_FILENO, character, sizeof (*character)); } static void render_string(char * string) { write(STDOUT_FILENO, string, strlen(string)); } static void render_colour(int colour, int effect) { char format[8] = "\033[ ;3 m"; format[2] = (char) (effect % 9) + '0'; format[5] = (char) (colour % 8) + '0'; render_string(format); } static void render_cancel(void) { render_string("\033[0m"); } static int is_separator(char character) { if (( isascii(character)) && (!isalnum(character)) && (character != '_')) { return 1; } else { return 0; } } static int compare_multiple_strings(char * string, const char * * strings, const int count) { int i = 0; do { if (!strcmp(string, strings[i])) { return 1; } } while (++i != count); return 0; } int main(int argc, char * * argv) { UNUSED(argc); UNUSED(argv); buffer = realloc(buffer, ALLOCATION_CHUNK); do { if (!((buffer_size + 1) % ALLOCATION_CHUNK)) { // Linear incremental reallocation (advanced)! size_t chunks = (buffer_size + 1) / ALLOCATION_CHUNK; buffer = realloc(buffer, ++chunks * ALLOCATION_CHUNK); } buffer[buffer_size] = '\0'; read(STDIN_FILENO, &buffer[buffer_size], sizeof (*buffer)); ++buffer_size; } while (buffer[buffer_size - 1]); buffer[buffer_size - 1] = '\0'; render_colour(RED, BOLD); render_string(buffer); render_cancel(); free (buffer); return 0; }