-
-
Save GaryMatthews/0f10c500e4386c0509716d0287bceaa7 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