Script files support
- readline accepts stream to read from - fixed issues with EOF - arsh can be called with a file path as a second parameter, that will be interpreted
This commit is contained in:
parent
e96ae4b4a2
commit
afbcaac1ae
1 changed files with 37 additions and 10 deletions
47
main.c
47
main.c
|
|
@ -21,22 +21,28 @@ void sigint_handler(int signo)
|
||||||
}
|
}
|
||||||
static constexpr size_t max_line = 1024;
|
static constexpr size_t max_line = 1024;
|
||||||
static char string_buffer[max_line];
|
static char string_buffer[max_line];
|
||||||
char* readline(char* print)
|
char* readline(char* print, FILE* stream)
|
||||||
{
|
{
|
||||||
if(print)
|
if(print)
|
||||||
{
|
{
|
||||||
printf("%s", print);
|
printf("%s", print);
|
||||||
}
|
}
|
||||||
if((fgets(string_buffer, max_line, stdin) == NULL) && ferror(stdin))
|
if(fgets(string_buffer, max_line, stream) == NULL)
|
||||||
{
|
{
|
||||||
perror("fgets error");
|
if (feof(stdin))
|
||||||
|
{
|
||||||
|
return NULL; // Ctrl+D
|
||||||
|
}
|
||||||
|
if(ferror(stream))
|
||||||
|
{
|
||||||
|
perror("fgets error");
|
||||||
|
clearerr(stdin);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t length = strlen(string_buffer);
|
size_t length = strlen(string_buffer);
|
||||||
if(length == 0)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
//Remove trailing \n
|
//Remove trailing \n
|
||||||
if (length > 0 && string_buffer[length - 1] == '\n')
|
if (length > 0 && string_buffer[length - 1] == '\n')
|
||||||
{
|
{
|
||||||
|
|
@ -73,8 +79,20 @@ int cd(char* path)
|
||||||
return chdir(path);
|
return chdir(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main()
|
int main(int argc, const char* argv[])
|
||||||
{
|
{
|
||||||
|
FILE* stream = stdin;
|
||||||
|
char* prompt = "arsh> ";
|
||||||
|
if(argc == 2)
|
||||||
|
{
|
||||||
|
FILE* file = fopen(argv[1], "r");
|
||||||
|
if(file)
|
||||||
|
{
|
||||||
|
stream = file;
|
||||||
|
prompt = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct sigaction s;
|
struct sigaction s;
|
||||||
s.sa_handler = sigint_handler;
|
s.sa_handler = sigint_handler;
|
||||||
sigemptyset(&s.sa_mask);
|
sigemptyset(&s.sa_mask);
|
||||||
|
|
@ -92,17 +110,26 @@ int main()
|
||||||
|
|
||||||
while(true)
|
while(true)
|
||||||
{
|
{
|
||||||
char* input = readline("arsh> ");
|
char* input = readline(prompt, stream);
|
||||||
if(input == NULL) //CTRL + D
|
if(input == NULL) //CTRL + D
|
||||||
{
|
{
|
||||||
printf("\nexit\n");
|
if(prompt)
|
||||||
|
{
|
||||||
|
printf("\nexit\n");
|
||||||
|
}
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// After that line you need cleanup
|
||||||
char** command = split_input(input);
|
char** command = split_input(input);
|
||||||
if(command[0] == NULL)
|
if(command[0] == NULL)
|
||||||
{
|
{
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
if(strlen(command[0]) >= 1 && command[0][0] == '#')
|
||||||
|
{
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
if(strcmp(command[0], "cd") == 0)
|
if(strcmp(command[0], "cd") == 0)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue