Neste exercício pretende-se que implemente um programa que mostre uma prompt ao utilizador (por exemplo my_prompt$), leia as strings correspondentes aos comandos que o utilizador for invocando, e para cada string lida chame uma função parse para estruturar os argumentos correspondentes ao comando invocado e uma função print_parse para imprimir o conteúdo da estrutura retornada por parse. O programa deve terminar quando o utilizador invocar o comando exit.
Para tal, considere o extracto de código que se segue e complete-o de acordo com as indicações abaixo:
#include <stdio.h>
#include <stdlib.h>
#include <readline/readline.h>
#include <readline/history.h>
#define MAXARGS 100
typedef struct command {
char *cmd; // string apenas com o comando
int argc; // número de argumentos
char *argv[MAXARGS+1]; // vector de argumentos do comando
} COMMAND;
COMMAND parse(char *linha);
void print_parse(COMMAND com);
main() {
char *linha;
COMMAND com;
while (1) {
if ((linha = readline("my_prompt$ ")) == NULL)
exit(0);
if (strlen(linha) != 0) {
add_history(linha);
com = parse(linha);
print_parse(com);
}
free(linha);
}
}
COMMAND parse(char *linha) {
// ...
}
void print_parse(COMMAND com) {
// ...
}
|
Para obter a string da linha de comando, use a biblioteca readline, que permite fazer edição e historial da linha de comandos de forma simples. A utilização desta biblioteca requer que o programa seja compilado com a opção -lreadline -lcurses.
A função parse deverá retornar uma estrutura do tipo COMMAND em que COMMAND é a estrutura de dados sugerida para estruturar os argumentos do comando invocado. O campo cmd possui o comando propriamente dito, o campo argc contém o número de argumentos, enquanto que o campo argv possui o vector de argumentos do comando. O primeiro argumento é o próprio comando (argv[0]=cmd), seguem-se os argumentos correspondentes aos argumentos do comando (argv[1], ..., argv[argc-1]) e termina com o argumento NULL (argv[argc]=NULL). Para percorrer a string do comando utilize a função strtok. Para mais informação consulte a man page respectiva.
A função print_parse deverá imprimir o conteúdo da estrutura COMMAND retornada por parse e no caso do comando invocado ser exit deverá terminar.