Простой интерпретатор командной строки - PullRequest
1 голос
/ 25 марта 2019

Мне нужно реализовать простой интерпретатор командной строки, способный интерпретировать набор внутренне реализованных команд. Я пытался с этим кодом, но он не работает вообще.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

#define MAXIMO 2048
#define BLANCO " "
#define FIN "FIN"
#define MSG_ERROR "ERROR!"
#define PROMPT "\n#@> "

int hayAmpersand(char cadena[]);

int main(int argc, char *argv[]) {
    char comando[MAXIMO] = "";
    char *palabras[MAXIMO];
    int e, i, ampersand;
    pid_t hijo, hijoMuerto;

    while(1) {
        // Vacio las cadenas al inicio de cada bucle
        comando[0] = '\0';
        ampersand = 0;

        printf(PROMPT);
        scanf("\n%[^\n]", comando); // Leemos la cadena entera

        if (strcmp(comando, FIN) == 0)
            return (0); // Si son iguales sale del programa

        if (hayAmpersand(comando) == 1)
            ampersand = 1;

        //== Cadenas
        //==========================================================
        // Sacamos la primera palabra de la cadena
        palabras[0] = strtok(comando, BLANCO);

        // Sacamos la otras palabras de la cadena
        i = 1;
        while ((palabras[i] = strtok(NULL, BLANCO)) != NULL)
            i++;
        //== Fin Cadenas
        //======================================================

        hijo = fork();

        switch (hijo) {
          case -1:
            perror(MSG_ERROR);
            exit(-1);
          case 0:
            execvp(palabras[0], &palabras[0]);
            perror(MSG_ERROR);
            exit(e);
          default:
            if (ampersand != 1) {
                hijoMuerto = 0;
                while ((hijo != hijoMuerto) && (hijoMuerto != -1))
                    hijoMuerto = wait(&e);
            }
        }
    }
    return (0);
}

int hayAmpersand(char cadena[]) {
    int j = 0;

    for (j = 0; j <= strlen(cadena); j++) {
        if (cadena[j] == '&') {
            cadena[j] = cadena[j + 1];
            return(1);
        }
    }
    return (0);
}

Вот упражнение: http://ciprianpungila.com/uvt/so2018/projects/35.txt

Более или менее это работает, но в упражнении нужно реализовать стрелки на клавиатуре, и я не знаю, как я могу это сделать в своем коде, если кто-то может мне помочь, я буду очень благодарен

Ответы [ 2 ]

1 голос
/ 26 марта 2019

Редактирование командной строки не является частью требований. Также вам явно не запрещено использовать readline(), который может быть доступен в вашей системе и выполняет только это.

Обратите внимание, что вашей текущей реализации требуется гораздо больше работы для удовлетворения реальных требований, поэтому я предлагаю вам сосредоточиться на них, а не тратить время на повторную реализацию редактора командной строки. Делать это правильно нетривиально.

Обратите также внимание, что использование scanf() не подходит для чтения строки ввода: scanf("\n%[^\n]", comando); действительно игнорирует любые пробелы и читает команду до следующей новой строки (исключено), но потенциально может записывать в память за пределами конец массива commando, который вызывает неопределенное поведение. Вместо этого вы должны использовать fgets(), readline() или пользовательскую письменную функцию для чтения ввода пользователя. Вы также обнаружили бы конец файла, который может быть полезен:)

0 голосов
/ 25 марта 2019

Вместо использования scanf вы можете использовать readline:

char *command = readline(PROMPT);

Однако я не уверен, что вам разрешено использовать readline в качестве упражнения ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...