intmain(int argc, charconst *argv[]) { time(¤t_time); //获取指令执行时的时间 analyse_input(argc, argv); //分析用户的输入 //用户加了帮助选项,输出帮助信息后退出 if (opts[_help]) { help(); exit(EXIT_SUCCESS); } //用户没有帮助选项,输出命令解析的结果并运行该命令 else { show_analyse_result(); int i = 0; for (i = 0; i < path_num; i++) { run(path[i]); } } free_path(); return0; }
/** * @name: free_path * @author: * @msg: 释放path分配的空间 * @param: 无 * @return: 无 */ voidfree_path() { int i = 0; for (i = 0; i < path_num; i++) free(path[i]); free(path); }
/** * @name: help * @author: * @msg: 打印帮助信息 * @param: 无 * @return: 无 */ voidhelp() { printf("%18sHELP%18s\n%s", "", "", split); printf("List %s by Sekiro Apr 10 2020\n", version); printf("Usage: ./list [OPTION]... [PATH]...\n"); printf("List informaton about the FILEs in these PATHs(the current directory by default)\nOptions:\n"); printf("\t-r\t\tList subdirectories recursively\n"); printf("\t-a\t\tDo not hide entries starting with .\n"); printf("\t-d\t\tShow detail information of file(only file path by default)\n"); printf("\t-l <bytes>\tMinmum of file size\n"); printf("\t-h <bytes>\tMaxmum of file size\n"); printf("\t-m <days>\tLimit file last changed time\n"); printf("\t-?\t\tDisplay this help and exit\n"); printf("Color:\n"); printf("\tWHITE: Regular file\n"); printf(YELLOW "\tYELLOW: Directory file\n" NONE); printf(CYAN "\tCYAN: Other file\n" NONE); printf(RED "\tRED: Error\n" NONE); printf("%s", split); }
/** * @name: analyse_input * @author: * @msg: 分析输入的命令的函数 * @param: 同main函数 * @return: 无 */ voidanalyse_input(int argc, charconst *argv[]) { path = (char **)malloc(argc * sizeof(char *)); int i = 1; int flag = 1; //记录选项分析是否终止,终止为0,未终止为1 for (i = 1; i < argc; i++) { //以-开头的是选项 if (flag && argv[i][0] == '-') { if (strlen(argv[i]) == 1) { printf(RED "ERROR: Input option wrong, please input the right option\n" NONE); printf("Here are some tips:\n"); help(); free_path(); exit(EXIT_FAILURE); } elseif (strlen(argv[i]) == 2) { switch (argv[i][1]) { case'r': opts[_r] = 1; break;
case'a': opts[_a] = 1; break;
case'd': opts[_d] = 1; break;
case'l': opts[_l] = 1; //判断-l选项后面有没有参数 if (i < argc - 1) { char *stop; longint size = strtol(argv[++i], &stop, 10); //stop长度为0代表进行了有效的转换 if (strlen(stop) == 0) { min_size = size; } else { printf(RED "ERROR: Input option -l wrong, there is no required min size, please input the right option\n" NONE); printf("Here are some tips:\n"); help(); free_path(); exit(EXIT_FAILURE); } } else { printf(RED "ERROR: Input option -l wrong, there is no required min size, please input the right option\n" NONE); printf("Here are some tips:\n"); help(); free_path(); exit(EXIT_FAILURE); } break;
case'h': opts[_h] = 1; //判断-h选项后面有没有参数 if (i < argc - 1) { char *stop; longint size = strtol(argv[++i], &stop, 10); //stop长度为0代表进行了有效的转换 if (strlen(stop) == 0) { max_size = size; } else { printf(RED "ERROR: Input option -h wrong, there is no required max size, please input the right option\n" NONE); printf("Here are some tips:\n"); help(); free_path(); exit(EXIT_FAILURE); } } else { printf(RED "ERROR: Input option -h wrong, there is no required max size, please input the right option\n" NONE); printf("Here are some tips:\n"); help(); free_path(); exit(EXIT_FAILURE); } break;
case'm': opts[_m] = 1; //判断-m选项后面有没有参数 if (i < argc - 1) { char *stop; longint day = strtol(argv[++i], &stop, 10); //stop长度为0代表进行了有效的转换 if (strlen(stop) == 0) { limit_day = day; } else { printf(RED "ERROR: Input option -m wrong, there is no required limit day, please input the right option\n" NONE); printf("Here are some tips:\n"); help(); free_path(); exit(EXIT_FAILURE); } } else { printf(RED "ERROR: Input option -m wrong, there is no required limit day, please input the right option\n" NONE); printf("Here are some tips:\n"); help(); free_path(); exit(EXIT_FAILURE); } break;
case'?': opts[_help] = 1; break;
case'-': flag = 0; break;
default: printf(RED "ERROR: Input option wrong, please input the right option\n" NONE); printf("Here are some tips:\n"); help(); free_path(); exit(EXIT_FAILURE); break; } } else { printf(RED "ERROR: Input option wrong, please input the right option\n" NONE); printf("Here are some tips:\n"); help(); free_path(); exit(EXIT_FAILURE); } } else { //不是-开头的认为是路径或者--后面的全部认为是路径 path[path_num] = (char *)malloc(strlen(argv[i]) * sizeof(char)); strcpy(path[path_num++], argv[i]); } } if (opts[_l] && opts[_h]) { if (min_size > max_size) { printf(RED "ERROR: Min size of file is less than Max size of file, please input the right option\n" NONE); printf("Here are some tips:\n"); help(); free_path(); exit(EXIT_FAILURE); } } //没有输入路径,默认为当前工作目录 if (path_num == 0) { path[path_num] = (char *)malloc(sizeof(char) * 255); if (!getcwd(path[path_num++], sizeof(char) * 255)) { printf(RED "ERROR: Get current work path wrong\n" NONE); free_path(); exit(EXIT_FAILURE); } } }
/** * @name: show_analyse_result * @author: * @msg: 输出命令解析的结果 * @param: 无 * @return: 无 */ voidshow_analyse_result() { printf("Input Analyse Results are:\n"); int i = 0; for (i = 0; i < OPTION_NUM; i++) { switch (i) { case _r: if (opts[i]) { printf("-r: True\n"); } else { printf("-r: False\n"); } break;
case _a: if (opts[i]) { printf("-a: True\n"); } else { printf("-a: False\n"); } break;
case _d: if (opts[i]) { printf("-d: True\n"); } else { printf("-d: False\n"); } break;
case _l: if (opts[i]) { printf("-l: True\tMin Size:%ld\n", min_size); } else { printf("-l: False\n"); } break;
case _h: if (opts[i]) { printf("-h: True\tMax Size:%ld\n", max_size); } else { printf("-h: False\n"); } break;
case _m: if (opts[i]) { printf("-m: True\tLimit Day:%ld\n", limit_day); } else { printf("-m: False\n"); } break;
case _help: if (opts[i]) { printf("-?: True\n"); } else { printf("-?: False\n"); } break;
default: printf(RED "ERROR: Unknown error, please consult me\n" NONE); break; } } printf("%s", split); printf("Path Count is: %d\nPath:\n", path_num); for (i = 0; i < path_num; i++) { printf("%s\n", path[i]); } printf("%s", split); }
intmain(int argc, charconst *argv[]) { time(¤t_time); //获取指令执行时的时间 analyse_input(argc, argv); //分析用户的输入 //用户加了帮助选项,输出帮助信息后退出 if (opts[_help]) { help(); exit(EXIT_SUCCESS); } //用户没有帮助选项,输出命令解析的结果并运行该命令 else { show_analyse_result(); int i = 0; for (i = 0; i < path_num; i++) { run(path[i]); } } free_path(); return0; }
/** * @name: free_path * @author: * @msg: 释放path分配的空间 * @param: 无 * @return: 无 */ voidfree_path() { int i = 0; for (i = 0; i < path_num; i++) free(path[i]); free(path); }
/** * @name: help * @author: * @msg: 打印帮助信息 * @param: 无 * @return: 无 */ voidhelp() { printf("%18sHELP%18s\n%s", "", "", split); printf("List %s by Sekiro Apr 13 2020\n", version); printf("Usage: ./list [OPTION]... [PATH]...\n"); printf("List informaton about the FILEs in these PATHs(the current directory by default)\nOptions:\n"); printf("\t-r, --recursive\t\tList subdirectories recursively\n"); printf("\t-a, --all\t\tDo not hide entries starting with .\n"); printf("\t-d, --detail\t\tShow detail information of file(only file path by default)\n"); printf("\t-l, --low=<bytes>\tMinmum of file size\n"); printf("\t-h, --high=<bytes>\tMaxmum of file size\n"); printf("\t-m, --mdays=<days>\tLimit file last changed time\n"); printf("\t-?, --help\t\tDisplay this help and exit\n"); printf("Color:\n"); printf("\tWHITE: Regular file\n"); printf(YELLOW "\tYELLOW: Directory file\n" NONE); printf(CYAN "\tCYAN: Other file\n" NONE); printf(RED "\tRED: Error\n" NONE); printf("%s", split); }
/** * @name: analyse_input * @author: * @msg: 分析输入的命令的函数 * @param: 同main函数 * @return: 无 */ voidanalyse_input(int argc, charconst *argv[]) { path = (char **)malloc(argc * sizeof(char *)); int i = 1; int flag = 1; //记录选项分析是否终止,终止为0,未终止为1 for (i = 1; i < argc; i++) { //以-开头的是选项 if (flag && argv[i][0] == '-') { if (strlen(argv[i]) == 1) { printf(RED "ERROR: Input option wrong, please input the right option\n" NONE); printf("Here are some tips:\n"); help(); free_path(); exit(EXIT_FAILURE); } elseif (strlen(argv[i]) == 2) { switch (argv[i][1]) { case'r': opts[_r] = 1; break;
case'a': opts[_a] = 1; break;
case'd': opts[_d] = 1; break;
case'l': opts[_l] = 1; //判断-l选项后面有没有参数 if (i < argc - 1) { char *stop; longint size = strtol(argv[++i], &stop, 10); //stop长度为0代表进行了有效的转换 if (strlen(stop) == 0) { min_size = size; } else { printf(RED "ERROR: Input option -l wrong, there is no required min size, please input the right option\n" NONE); printf("Here are some tips:\n"); help(); free_path(); exit(EXIT_FAILURE); } } else { printf(RED "ERROR: Input option -l wrong, there is no required min size, please input the right option\n" NONE); printf("Here are some tips:\n"); help(); free_path(); exit(EXIT_FAILURE); } break;
case'h': opts[_h] = 1; //判断-h选项后面有没有参数 if (i < argc - 1) { char *stop; longint size = strtol(argv[++i], &stop, 10); //stop长度为0代表进行了有效的转换 if (strlen(stop) == 0) { max_size = size; } else { printf(RED "ERROR: Input option -h wrong, there is no required max size, please input the right option\n" NONE); printf("Here are some tips:\n"); help(); free_path(); exit(EXIT_FAILURE); } } else { printf(RED "ERROR: Input option -h wrong, there is no required max size, please input the right option\n" NONE); printf("Here are some tips:\n"); help(); free_path(); exit(EXIT_FAILURE); } break;
case'm': opts[_m] = 1; //判断-m选项后面有没有参数 if (i < argc - 1) { char *stop; longint day = strtol(argv[++i], &stop, 10); //stop长度为0代表进行了有效的转换 if (strlen(stop) == 0) { limit_day = day; } else { printf(RED "ERROR: Input option -m wrong, there is no required limit day, please input the right option\n" NONE); printf("Here are some tips:\n"); help(); free_path(); exit(EXIT_FAILURE); } } else { printf(RED "ERROR: Input option -m wrong, there is no required limit day, please input the right option\n" NONE); printf("Here are some tips:\n"); help(); free_path(); exit(EXIT_FAILURE); } break;
case'?': opts[_help] = 1; break;
case'-': flag = 0; break;
default: printf(RED "ERROR: Input option wrong, please input the right option\n" NONE); printf("Here are some tips:\n"); help(); free_path(); exit(EXIT_FAILURE); break; } } //长度>2的情况,也就是长选项 else { if (strchr(argv[i], '=')) { if (strstr(argv[i], "--low=")) { opts[_l] = 1; //判断--low选项后面有没有参数 if (strlen(argv[i]) > 6) { char *stop; longint size = strtol(argv[i] + sizeof(char) * 6, &stop, 10); //stop长度为0代表进行了有效的转换 if (strlen(stop) == 0) { min_size = size; } else { printf(RED "ERROR: Input option --low wrong, there is no required min size, please input the right option\n" NONE); printf("Here are some tips:\n"); help(); free_path(); exit(EXIT_FAILURE); } } else { printf(RED "ERROR: Input option --low wrong, there is no required min size, please input the right option\n" NONE); printf("Here are some tips:\n"); help(); free_path(); exit(EXIT_FAILURE); } } elseif (strstr(argv[i], "--high=")) { opts[_h] = 1; //判断--high选项后面有没有参数 if (strlen(argv[i]) > 7) { char *stop; longint size = strtol(argv[i] + sizeof(char) * 7, &stop, 10); //stop长度为0代表进行了有效的转换 if (strlen(stop) == 0) { max_size = size; } else { printf(RED "ERROR: Input option --high wrong, there is no required max size, please input the right option\n" NONE); printf("Here are some tips:\n"); help(); free_path(); exit(EXIT_FAILURE); } } else { printf(RED "ERROR: Input option --high wrong, there is no required max size, please input the right option\n" NONE); printf("Here are some tips:\n"); help(); free_path(); exit(EXIT_FAILURE); } } elseif (strstr(argv[i], "--mdays=")) { opts[_m] = 1; //判断--mdays选项后面有没有参数 if (strlen(argv[i]) > 8) { char *stop; longint day = strtol(argv[i] + sizeof(char) * 8, &stop, 10); //stop长度为0代表进行了有效的转换 if (strlen(stop) == 0) { limit_day = day; } else { printf(RED "ERROR: Input option --mdays wrong, there is no required limit day, please input the right option\n" NONE); printf("Here are some tips:\n"); help(); free_path(); exit(EXIT_FAILURE); } } else { printf(RED "ERROR: Input option --mdays wrong, there is no required limit day, please input the right option\n" NONE); printf("Here are some tips:\n"); help(); free_path(); exit(EXIT_FAILURE); } } else { printf(RED "ERROR: Input option wrong, please input the right option\n" NONE); printf("Here are some tips:\n"); help(); free_path(); exit(EXIT_FAILURE); } } else { if (strcmp("--recursive", argv[i]) == 0) { opts[_r] = 1; } elseif (strcmp("--all", argv[i]) == 0) { opts[_a] = 1; } elseif (strcmp("--detail", argv[i]) == 0) { opts[_d] = 1; } elseif (strcmp("--help", argv[i]) == 0) { opts[_help] = 1; } else { printf(RED "ERROR: Input option wrong, please input the right option\n" NONE); printf("Here are some tips:\n"); help(); free_path(); exit(EXIT_FAILURE); } } } } else { //不是-开头的认为是路径或者--后面的全部认为是路径 path[path_num] = (char *)malloc(strlen(argv[i]) * sizeof(char)); strcpy(path[path_num++], argv[i]); } } if (opts[_l] && opts[_h]) { if (min_size > max_size) { printf(RED "ERROR: Min size of file is less than Max size of file, please input the right option\n" NONE); printf("Here are some tips:\n"); help(); free_path(); exit(EXIT_FAILURE); } } //没有输入路径,默认为当前工作目录 if (path_num == 0) { path[path_num] = (char *)malloc(sizeof(char) * 255); if (!getcwd(path[path_num++], sizeof(char) * 255)) { printf(RED "ERROR: Get current work path wrong\n" NONE); free_path(); exit(EXIT_FAILURE); } } }
/** * @name: show_analyse_result * @author: * @msg: 输出命令解析的结果 * @param: 无 * @return: 无 */ voidshow_analyse_result() { printf("Input Analyse Results are:\n"); int i = 0; for (i = 0; i < OPTION_NUM; i++) { switch (i) { case _r: if (opts[i]) { printf("-r, --recursive: True\n"); } else { printf("-r, --recursive: False\n"); } break;
case _a: if (opts[i]) { printf("-a, --all:\t True\n"); } else { printf("-a, --all:\t False\n"); } break;
case _d: if (opts[i]) { printf("-d, --detail:\t True\n"); } else { printf("-d, --detail:\t False\n"); } break;
case _l: if (opts[i]) { printf("-l, --low:\t True\tMin Size:%ld\n", min_size); } else { printf("-l, --low:\t False\n"); } break;
case _h: if (opts[i]) { printf("-h, --high:\t True\tMax Size:%ld\n", max_size); } else { printf("-h, --high:\t False\n"); } break;
case _m: if (opts[i]) { printf("-m, --mdays:\t True\tLimit Day:%ld\n", limit_day); } else { printf("-m, --mdays:\t False\n"); } break;
case _help: if (opts[i]) { printf("-?, --help:\t True\n"); } else { printf("-?, --help:\t False\n"); } break;
default: printf(RED "ERROR: Unknown error, please consult me\n" NONE); break; } } printf("%s", split); printf("Path Count is: %d\nPath:\n", path_num); for (i = 0; i < path_num; i++) { printf("%s\n", path[i]); } printf("%s", split); }