You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

129 lines
2.0 KiB

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "fun.h"
void eval(char *cmdline)
{
char *argv[MAXLINE];
char buf[MAXLINE];
int isBg;
int pid;
strcpy(buf,cmdline);
isBg = parseline(cmdline,argv);
if(argv[0] == NULL)
{
return;
}
if(!builtin_cmd(argv))
{
/*
if((pid=fork())==0)
{
setpgid(0,0);
if(execvp(argv[0],argv)<0)
{
printf("%s:Command not found.\n",argv[0]);
exit(0);
}
}
if(!isBg)
{
waitfg(pid);
}
else
{
printf("[%d] (%d) %s",pid2jid(pid),pid,cmdline);
}
*/
}
return;
}
int parseline(const char *cmdline, char **argv)
{
static char array[MAXLINE];
char *buf = array;
char *delim;
int argc;
int bg;
strcpy(buf, cmdline);
buf[strlen(buf)-1] = ' ';
while (*buf && (*buf == ' '))
buf++;
argc = 0;
if (*buf == '\'')
{
buf++;
delim = strchr(buf, '\'');
}
else
{
delim = strchr(buf, ' ');
}
while (delim)
{
argv[argc++] = buf;
*delim = '\0';
buf = delim + 1;
while (*buf && (*buf == ' '))
{
buf++;
}
if (*buf == '\'')
{
buf++;
delim = strchr(buf, '\'');
}
else
{
delim = strchr(buf, ' ');
}
}
argv[argc] = NULL;
if (argc == 0)
return 1;
if ((bg = (*argv[argc-1] == '&')) != 0)
{
argv[--argc] = NULL;
}
return bg;
}
int builtin_cmd(char **argv)
{
if(!strcmp(argv[0],"quit")||!strcmp(argv[0],"exit"))
{
exit(0);
}
if(!strcmp(argv[0],"history"))
{
print_his(argv[1]);
return 1;
}
if(!strcmp(argv[0],"jobs"))
{
return 1;
}
if(!strcmp(argv[0],"bg")||!strcmp(argv[0],"fg"))
{
return 1;
}
if(!strcmp(argv[0], "&"))
{
return 1;
}
return 0;
}