void execCd(){ char temp[MAX_ARGU_LENGTH]; int i=2; int k=0; if(inputBuff[2]=='\0'){ chdir("/home"); return ; } while(inputBuff[i]==' '||inputBuff[i]=='\t') i++; for(;k<MAX_ARGU_LENGTH&&inputBuff[i]!=' '&&inputBuff[i]!='\t'&&inputBuff[i]!='\0';k++,i++) temp[k]=inputBuff[i]; temp[k]='\0'; if(hasWildcard(temp)){ p=(StrList*)malloc(sizeof(StrList)); p->link=NULL; heads=p; split(temp); completeArg("/",0); p=heads->link; if(chdir(p->str)<0) printf("cd; %s 错误的文件名或文件夹名!\n", p->str); } else if(chdir(temp) < 0){ printf("cd; %s 错误的文件名或文件夹名!\n", temp); } //printf("%s|\n",temp); }
int parse(const MyString& cmd, MyString* name, Vector<MyString>* pathes, Vector<MyString>* switches) { if (name == nullptr || pathes == nullptr || switches == nullptr) { return -1; } pathes->clear(); switches->clear(); int i = getCmd(cmd, 0, name); if (i == cmd.size()) { return 0; } if (*name == _T("mkdir")) { while (_istspace(cmd[i])) ++i; int j = cmd.size() - 1; while (_istspace(cmd[j])) --j; MyString path = cmd.substr(i, j - i + 1); pathes->append(path); return 0; } for (; i < cmd.size();) { if (_istspace(cmd[i])) { ++i; } else if (cmd[i] != _T('/')) { MyString path; i = getPath(cmd, i, &path); if (!isPath(path) && !hasWildcard(path)) { printf("文件名、目录名或卷标语法不正确\n"); *name = _T(""); pathes->clear(); switches->clear(); return -1; } pathes->append(path); } else if (cmd[i] == _T('/')) { MyString s; i = getSwitch(cmd, i, &s); switches->append(s); } else { assert(0); return -1; } } return 0; }
void CommandCopy::exec(VirtualDiskNode* vfs) { if (!isNormalizedPath(m_dst)) { m_dst = vfs->pathNormalize(m_dst); } if (hasWildcard(m_src)) { WIN32_FIND_DATA find_data; HANDLE find_iter = INVALID_HANDLE_VALUE; find_iter = FindFirstFile(m_src.c_str(), &find_data); if (find_iter == INVALID_HANDLE_VALUE) { _tprintf(_T("系统找不到指定的文件\n")); } do { if (find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { continue; } MyString file_name(find_data.cFileName); if (hasWildcard(m_dst)) { if (!match(file_name, basename(m_dst))) { continue; } MyString src = join(dirname(m_src), file_name); MyString dst = join(dirname(m_dst), file_name); if (copyFile(src, dst, vfs) == -1) { assert(0); continue; } } else { MyString src = join(dirname(m_src), file_name); MyString dst = join(m_dst, file_name); if (!vfs->isDir(m_dst)) { _tprintf(_T("系统找不到指定的目录\n")); continue; } if (copyFile(src, dst, vfs) == -1) { assert(0); continue; } } } while (FindNextFile(find_iter, &find_data) != 0); } else { if (vfs->isDir(m_dst)) { m_dst = join(m_dst, basename(m_src)); } else { MyString file_name = basename(m_dst); if (!isLegalName(file_name)) { throw CommandException(_T("文件名不能包含非法字符\n")); } } copyFile(m_src, m_dst, vfs); } return; }
SimpleCmd * handleSimpleCmd(int begin,int end){ int i, j, k; int fileFinished; //记录命令是否解析完毕 char c, buff[50][200], inputFile[30], outputFile[30], *temp = NULL; SimpleCmd *cmd = (SimpleCmd*)malloc(sizeof(SimpleCmd)); #ifdef DEBUG printf("%s!\n",inputBuff); #endif //默认为非后台命令,输入输出重定向为null cmd->isBack = 0; cmd->input = cmd->output = NULL; //初始化相应变量 for(i = begin; i<50; i++){ buff[i][0] = '\0'; } inputFile[0] = '\0'; outputFile[0] = '\0'; i = begin; //跳过空格等无用信息 while(i < end && (inputBuff[i] == ' ' || inputBuff[i] == '\t')){ i++; } k = 0; j = 0; fileFinished = 0; temp = buff[k]; //以下通过temp指针的移动实现对buff[i]的顺次赋值过程 while(i < end){ /*根据命令字符的不同情况进行不同的处理*/ switch(inputBuff[i]){ case ' ': case '\t': //命令名及参数的结束标志 temp[j] = '\0'; j = 0; if(!fileFinished){ k++; temp = buff[k]; } break; case '<': //输入重定向标志 if(j != 0){ //此判断为防止命令直接挨着<符号导致判断为同一个参数,如果ls<sth temp[j] = '\0'; j = 0; if(!fileFinished){ k++; temp = buff[k]; } } temp = inputFile; fileFinished = 1; i++; break; case '>': //输出重定向标志 if(j != 0){ temp[j] = '\0'; j = 0; if(!fileFinished){ k++; temp = buff[k]; } } temp = outputFile; fileFinished = 1; i++; break; case '&': //后台运行标志 if(j != 0){ temp[j] = '\0'; j = 0; //printf("temp:%s\n",temp); if(!fileFinished){ k++; temp = buff[k]; } } cmd->isBack = 1; fileFinished = 1; i++; break; default: //默认则读入到temp指定的空间 temp[j++] = inputBuff[i++]; continue; } //跳过空格等无用信息 while(i < end && (inputBuff[i] == ' ' || inputBuff[i] == '\t')){ i++; } } if(inputBuff[end-1] != ' ' && inputBuff[end-1] != '\t' ){ temp[j] = '\0'; if(!fileFinished){ k++; } } //printf("k%d\n",k); //依次为命令名及其各个参数赋值 cmd->args = (char**)malloc(sizeof(char*) * (MAX_ARGU_NUM)); j=0; for(i = 0; i<k; i++){ if(hasWildcard(buff[i])){ p=(StrList*)malloc(sizeof(StrList)); p->link=NULL; heads=p; split(buff[i]); completeArg("/",0); p=heads->link; while(p!=NULL){ cmd->args[j]=(char *)malloc(sizeof(char)*(1+strlen(p->str))); strcpy(cmd->args[j++], p->str); p=p->link; } }else{ cmd->args[j] = (char*)malloc(sizeof(char) * (strlen(buff[i]) + 1)); strcpy(cmd->args[j++], buff[i]); } //printf("%s\n",cmd->args[i]); } cmd->args[j]=NULL; //如果有输入重定向文件,则为命令的输入重定向变量赋值 if(strlen(inputFile) != 0){ j = strlen(inputFile); cmd->input = (char*)malloc(sizeof(char) * (j + 1)); strcpy(cmd->input, inputFile); } //如果有输出重定向文件,则为命令的输出重定向变量赋值 if(strlen(outputFile) != 0){ j = strlen(outputFile); cmd->output = (char*)malloc(sizeof(char) * (j + 1)); strcpy(cmd->output, outputFile); } #ifdef DEBUG printf("****\n"); printf("isBack: %d\n",cmd->isBack); for(i = 0; i<j; i++){ printf("args[%d]: %s\n",i,cmd->args[i]); } printf("input: %s\n",cmd->input); printf("output: %s\n",cmd->output); printf("****\n"); #endif return cmd; }