Skip to content

Instantly share code, notes, and snippets.

@HorlogeSkynet
Last active May 25, 2019 13:46
Show Gist options
  • Save HorlogeSkynet/8f885e2994be773976b6bdad7d29320e to your computer and use it in GitHub Desktop.
Save HorlogeSkynet/8f885e2994be773976b6bdad7d29320e to your computer and use it in GitHub Desktop.
A simple C string parser for CLI programs
#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