Improved CLI
This commit is contained in:
151
src/main.c
151
src/main.c
@ -7,6 +7,10 @@
|
||||
#define ALLOCATION_CHUNK (1024UL)
|
||||
#define ALLOCATION_LIMIT (1024UL * 1024UL)
|
||||
|
||||
#ifndef PROGN
|
||||
# define PROGN "hl"
|
||||
#endif
|
||||
|
||||
enum { NORMAL, BOLD, DARKNESS, ITALIC, UNDERLINE, BLINK, DUNNO_6, REVERSE, INVISIBLE };
|
||||
enum { GREY, RED, GREEN, YELLOW, BLUE, PINK, CYAN, WHITE, CANCEL };
|
||||
|
||||
@ -30,8 +34,6 @@ static int effect_keyword = BOLD;
|
||||
static int effect_preprocessor = BOLD;
|
||||
static int effect_default = BOLD;
|
||||
|
||||
static char * buffer = NULL;
|
||||
|
||||
static unsigned long int buffer_size = 0;
|
||||
|
||||
static void render_character (
|
||||
@ -65,9 +67,11 @@ static void render_colour (
|
||||
static int is_space (
|
||||
char character
|
||||
) {
|
||||
if ((character == ' ') || (character == '\t') || (character == '\r') || (character == '\n')) {
|
||||
switch (character)
|
||||
{
|
||||
case ' ': case '\t': case '\r': case '\n':
|
||||
return (1);
|
||||
} else {
|
||||
default:
|
||||
return (0);
|
||||
}
|
||||
}
|
||||
@ -75,15 +79,17 @@ static int is_space (
|
||||
static int is_separator (
|
||||
char character
|
||||
) {
|
||||
if ((character == ' ') || (character == '\t') || (character == '\r') || (character == '\n') ||
|
||||
(character == '+') || (character == '-') || (character == '*') || (character == '/') ||
|
||||
(character == '(') || (character == ')') || (character == '[') || (character == ']') ||
|
||||
(character == '{') || (character == '}') || (character == '<') || (character == '>') ||
|
||||
(character == ';') || (character == ':') || (character == ',') || (character == '.') ||
|
||||
(character == '!') || (character == '&') || (character == '|') || (character == '?') ||
|
||||
(character == '~') || (character == '^') || (character == '%') || (character == '=')) {
|
||||
switch (character)
|
||||
{
|
||||
case ' ': case '\t': case '\r': case '\n':
|
||||
case '+': case '-': case '*': case '/':
|
||||
case '(': case ')': case '[': case ']':
|
||||
case '{': case '}': case '<': case '>':
|
||||
case ';': case ':': case ',': case '.':
|
||||
case '!': case '&': case '|': case '?':
|
||||
case '~': case '^': case '%': case '=':
|
||||
return (1);
|
||||
} else {
|
||||
default:
|
||||
return (0);
|
||||
}
|
||||
}
|
||||
@ -106,6 +112,7 @@ static int compare_multiple_strings (
|
||||
}
|
||||
|
||||
static int render_short_comment (
|
||||
char * buffer,
|
||||
int data_offset
|
||||
) {
|
||||
render_colour (colour_short_comment, effect_short_comment);
|
||||
@ -122,6 +129,7 @@ static int render_short_comment (
|
||||
}
|
||||
|
||||
static int render_long_comment (
|
||||
char * buffer,
|
||||
int data_offset
|
||||
) {
|
||||
render_colour (colour_long_comment, effect_long_comment);
|
||||
@ -140,6 +148,7 @@ static int render_long_comment (
|
||||
}
|
||||
|
||||
static int render_short_string (
|
||||
char * buffer,
|
||||
int data_offset
|
||||
) {
|
||||
render_colour (colour_short_string, effect_short_string);
|
||||
@ -160,6 +169,7 @@ static int render_short_string (
|
||||
}
|
||||
|
||||
static int render_long_string (
|
||||
char * buffer,
|
||||
int data_offset
|
||||
) {
|
||||
render_colour (colour_long_string, effect_long_string);
|
||||
@ -180,6 +190,7 @@ static int render_long_string (
|
||||
}
|
||||
|
||||
static int render_separator (
|
||||
char * buffer,
|
||||
int data_offset
|
||||
) {
|
||||
if (is_space (buffer [data_offset]) != 0) {
|
||||
@ -195,6 +206,7 @@ static int render_separator (
|
||||
}
|
||||
|
||||
static int render_number (
|
||||
char * buffer,
|
||||
int data_offset
|
||||
) {
|
||||
render_colour (colour_number, effect_number);
|
||||
@ -208,6 +220,7 @@ static int render_number (
|
||||
}
|
||||
|
||||
static int render_word (
|
||||
char * buffer,
|
||||
int data_offset
|
||||
) {
|
||||
const char * c_keywords [32] = {
|
||||
@ -252,6 +265,61 @@ static int render_word (
|
||||
|
||||
return (data_offset);
|
||||
}
|
||||
|
||||
void
|
||||
handle_buffer(
|
||||
char * buffer
|
||||
) {
|
||||
int offset = 0;
|
||||
while (buffer [offset] != '\0') {
|
||||
if ((buffer [offset] == '/') && (buffer [offset + 1] == '/')) {
|
||||
offset = render_short_comment (buffer, offset);
|
||||
} else if ((buffer [offset] == '/') && (buffer [offset + 1] == '*')) {
|
||||
offset = render_long_comment (buffer, offset);
|
||||
} else if (buffer [offset] == '\'') {
|
||||
offset = render_short_string (buffer, offset);
|
||||
} else if (buffer [offset] == '"') {
|
||||
offset = render_long_string (buffer, offset);
|
||||
} else if (is_separator (buffer [offset]) != 0) {
|
||||
offset = render_separator (buffer, offset);
|
||||
} else if ((buffer [offset] >= '0') && (buffer [offset] <= '9')) {
|
||||
offset = render_number (buffer, offset);
|
||||
} else {
|
||||
offset = render_word (buffer, offset);
|
||||
}
|
||||
render_colour (CANCEL, NORMAL);
|
||||
}
|
||||
}
|
||||
|
||||
static char *
|
||||
slurp(const char * fn)
|
||||
{
|
||||
size_t len;
|
||||
char * b;
|
||||
FILE * fp = fopen(fn, "r");
|
||||
if (fp)
|
||||
{
|
||||
fseek(fp, 0, SEEK_END);
|
||||
len = ftell(fp);
|
||||
rewind(fp);
|
||||
b = malloc(len);
|
||||
if (b &&
|
||||
len != fread(b, 1, len, fp))
|
||||
{ perror(PROGN); }
|
||||
fclose(fp);
|
||||
return b;
|
||||
}
|
||||
else
|
||||
{ return NULL; }
|
||||
}
|
||||
|
||||
#define OPT(c,s) \
|
||||
if ((c == argv[0][0] && argv[0][1] == '\0') || \
|
||||
0 == strncmp(argv[0], s, strlen(s)))
|
||||
|
||||
#define SOPT(s) \
|
||||
if (0 == strncmp(argv[0], s, strlen(s)))
|
||||
|
||||
/*
|
||||
Valgrind: Depends on uninitialized value (buffer [0])...?
|
||||
280 : } while ((buffer [buffer_size - 1] != '\0') || (buffer_size != ALLOCATION_LIMIT));
|
||||
@ -261,48 +329,59 @@ int main (
|
||||
int argc,
|
||||
char ** argv
|
||||
) {
|
||||
int offset = 0;
|
||||
char * buffer = NULL;
|
||||
|
||||
if (argc != 1) {
|
||||
(void) argv;
|
||||
puts ("ARGUMENTS \"Heyo world!\"");
|
||||
return (-1);
|
||||
while (++argv, --argc) {
|
||||
if (argv[0][0] == '-') {
|
||||
argv[0]++;
|
||||
OPT ('?',"help") {
|
||||
fprintf (stderr, PROGN ": ... | hl [OPTIONS] FILES ...\n");
|
||||
return (0);
|
||||
}
|
||||
SOPT ("version") {
|
||||
fprintf(stderr, PROGN ": Version 9000\n");
|
||||
return (0);
|
||||
}
|
||||
else {
|
||||
fprintf (stderr, PROGN ": Unrecognized option '%s'\n", argv [0]);
|
||||
return (1);
|
||||
}
|
||||
} else {
|
||||
if ((buffer = slurp (argv [0]))) {
|
||||
handle_buffer (buffer);
|
||||
free (buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
buffer = realloc (buffer, ALLOCATION_CHUNK);
|
||||
|
||||
#define MEMFAIL(v) if (v == NULL) { perror(PROGN); return (1); }
|
||||
MEMFAIL(buffer);
|
||||
|
||||
do {
|
||||
if ((buffer_size + 1) % ALLOCATION_CHUNK == 0) {
|
||||
buffer = realloc (buffer, ((buffer_size + 1) / ALLOCATION_CHUNK + 1) * ALLOCATION_CHUNK);
|
||||
buffer = realloc (buffer,
|
||||
((buffer_size + 1)
|
||||
/ ALLOCATION_CHUNK + 1)
|
||||
* ALLOCATION_CHUNK);
|
||||
MEMFAIL(buffer);
|
||||
}
|
||||
buffer [buffer_size] = '\0'; /* Fixing Valgrind warnings... */
|
||||
read (STDIN_FILENO, & buffer [buffer_size], sizeof (* buffer));
|
||||
++buffer_size;
|
||||
} while ((buffer [buffer_size - 1] != '\0') /*|| (buffer_size != ALLOCATION_LIMIT)*/);
|
||||
} while ((buffer [buffer_size - 1] != '\0') /*||
|
||||
(buffer_size != ALLOCATION_LIMIT)*/);
|
||||
|
||||
buffer [buffer_size - 1] = '\0';
|
||||
|
||||
/* Checking if long comments work... */
|
||||
// Checking if short comments work...
|
||||
/* Checking if long comments work... */
|
||||
|
||||
while (buffer [offset] != '\0') {
|
||||
if ((buffer [offset] == '/') && (buffer [offset + 1] == '/')) {
|
||||
offset = render_short_comment (offset);
|
||||
} else if ((buffer [offset] == '/') && (buffer [offset + 1] == '*')) {
|
||||
offset = render_long_comment (offset);
|
||||
} else if (buffer [offset] == '\'') {
|
||||
offset = render_short_string (offset);
|
||||
} else if (buffer [offset] == '"') {
|
||||
offset = render_long_string (offset);
|
||||
} else if (is_separator (buffer [offset]) != 0) {
|
||||
offset = render_separator (offset);
|
||||
} else if ((buffer [offset] >= '0') && (buffer [offset] <= '9')) {
|
||||
offset = render_number (offset);
|
||||
} else {
|
||||
offset = render_word (offset);
|
||||
}
|
||||
render_colour (CANCEL, NORMAL);
|
||||
}
|
||||
handle_buffer(buffer);
|
||||
|
||||
free (buffer);
|
||||
|
||||
|
4
tests/extra.c
Normal file
4
tests/extra.c
Normal file
@ -0,0 +1,4 @@
|
||||
int
|
||||
main(void)
|
||||
|
||||
{nothing.}
|
@ -319,3 +319,4 @@ signed main(){
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user