Last active
May 25, 2019 13:46
-
-
Save HorlogeSkynet/8f885e2994be773976b6bdad7d29320e to your computer and use it in GitHub Desktop.
A simple C string parser for CLI programs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <unistd.h> | |
#include <inttypes.h> | |
#define BUFFER 1024 | |
void prompt_keyboard(char *const buffer) | |
{ | |
printf("|: "); | |
fflush(stdout); | |
strncpy(buffer, "", BUFFER); | |
fgets(buffer, BUFFER, stdin); | |
} | |
void free_args(char **args, int16_t *const nbArgs) | |
{ | |
for(uint16_t i = 0; i < *nbArgs; i++) | |
{ | |
free(args[i]); | |
args[i] = NULL; | |
} | |
*nbArgs = 0; | |
} | |
void parse_command(char *const buffer, char **const args, int16_t *const nbArgs) | |
{ | |
size_t size = 0; | |
char *ptr = NULL; | |
uint16_t i = 0; | |
const size_t length = strlen(buffer); | |
// Remove the new line character (mandatory with 'fgets()') | |
if(buffer[length - 1] == '\n') | |
{ | |
buffer[length - 1] = '\0'; | |
} | |
while(i < length) | |
{ | |
while(buffer[i] == ' ' || buffer[i] == '\t' || buffer[i] == '\0') | |
{ | |
if(++i >= length) | |
{ | |
break; | |
} | |
} | |
if(i >= length) | |
{ | |
break; | |
} | |
/* | |
if(buffer[i] == '#') | |
{ | |
// Here you can do some operations if this special character is present, or directly go downside. | |
// As you want ! | |
} | |
*/ | |
// Do some magic here ! | |
ptr = strstr(buffer + i, " "); | |
size = strlen(buffer + i) - (ptr != NULL ? strlen(ptr) : 0); | |
args[*nbArgs] = strndup(buffer + i, size); | |
(*nbArgs)++; | |
i += size + 1; | |
} | |
} | |
void print_args(char *const *const args, const int16_t nbArgs) | |
{ | |
for(uint16_t i = 0; i < nbArgs; i++) | |
{ | |
printf("\narg[%d]: %s", i, args[i]); | |
} | |
printf("\n\n"); | |
} | |
int main(int argc, char const *argv[]) | |
{ | |
(void)argc; | |
(void)argv; | |
char buffer[BUFFER]; | |
char *args[BUFFER]; | |
int16_t nbArgs = -1; | |
while(1) | |
{ | |
prompt_keyboard(buffer); | |
free_args(args, &nbArgs); | |
parse_command(buffer, args, &nbArgs); | |
print_args(args, nbArgs); | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment