struct-lab-03/handler.h

503 lines
8.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "include/ui.h"
#include "structs.h"
#include <stdio.h>
#define MAX_ARG_LEN 200
#define OBJECT_WRONG 0
#define OBJECT_FOLDER 1
#define OBJECT_FILE 2
int checkCommandValid(char *command)
{
for (size_t i = 0; i < COMMAND_COUNT; i++)
{
if (strcmp(allowedCommands[i], command) == 0)
{
return SUCCESS;
}
}
return FAILURE;
}
int checkMinorArgumentValid(char *command, char *argument)
{
if (argument[1] == 'l' || argument[1] == 'r')
{
if (strlen(argument) == 2)
{
if (!strcmp(command, "ls"))
{
if (argument[1] != 'l')
return FAILURE;
}
else if (!strcmp(command, "rm"))
{
if (argument[1] != 'r')
return FAILURE;
}
else
{
return FAILURE;
}
return SUCCESS;
}
else
{
return FAILURE;
}
}
else
return FAILURE;
}
int checkMajorArgumentValid(char *argument, Folder *RootFolder, Folder *CurrentFolder, Folder **ResultFolder, File **ResultFile)
{
Folder *ptr;
char *path = (char *)malloc(MAX_COMMAND_LEN);
strcpy(path, argument);
for (size_t i = 0; i < strlen(path); i++)
{
if (path[i] == '\n')
{
path[i] = '\0';
}
}
if (argument[0] == '/')
{
// Абсолютный путь
ptr = RootFolder;
}
else
{
// Относительный путь
ptr = CurrentFolder;
}
char *sep = "/", *istr;
istr = strtok(path, sep);
int foundFlag;
while (istr != NULL)
{
foundFlag = 1;
for (size_t i = 0; i < ptr->folders_count_cur; i++)
{
if (!strcmp(ptr->folders[i].filename, istr))
{
foundFlag = 0;
ptr = &ptr->folders[i];
break;
}
}
printf("ptr: %s\n", ptr->filename);
if (foundFlag)
{
int isFileFlag = 0;
for (size_t i = 0; i < strlen(istr); i++)
{
if (istr[i] == '.')
{
isFileFlag = 1;
break;
}
}
if (isFileFlag)
{
char *filename = (char *)malloc(filename_lenth + 1);
char *extension = (char *)malloc(extinsion_lenth + 1);
int extFlag = 1;
int writeCount = 0;
for (size_t i = 0; i < strlen(istr); i++) // Отделяем имя файла от расширения
{
if (istr[i] == '.')
{
extFlag = 0;
filename[writeCount + 1] = '\0';
writeCount = 0;
continue;
}
if (extFlag)
{
filename[writeCount] = istr[i];
}
else
{
extension[writeCount] = istr[i];
}
writeCount++;
}
for (size_t i = 0; i < ptr->files_count_cur; i++)
{
if (!strcmp(ptr->files[i].filename, filename) && !strcmp(ptr->files[i].extension, extension))
{
free(path);
free(filename);
free(extension);
*ResultFile = &ptr->files[i];
return OBJECT_FILE;
}
}
free(filename);
free(extension);
}
printf("Cannot resolve %s\n", istr);
return WRONG_ARGUMENT_FAILURE;
}
istr = strtok(NULL, sep);
}
free(path);
*ResultFolder = ptr;
// printf("--- %d %d\n", ptr, ResultFolder);
return OBJECT_FOLDER;
}
int checkArgumentValid(char *command, char *argument, Folder *RootFolder, Folder *CurrentFolder, Folder **resultFolder, File **resultFile)
{
Folder *_ResultFolder;
File *_ResultFile;
int iResult;
if (argument == NULL)
{
return WRONG_ARGUMENT_FAILURE;
}
if (argument[0] == '-')
{
if (checkMinorArgumentValid(command, argument))
{
return WRONG_OPTION;
}
}
else
{
// Обрабатываем объект
iResult = checkMajorArgumentValid(argument, RootFolder, CurrentFolder, &_ResultFolder, &_ResultFile);
if (iResult == WRONG_ARGUMENT_FAILURE)
{
return WRONG_ARGUMENT_FAILURE;
}
if (iResult == OBJECT_FILE)
{
*resultFile = _ResultFile;
}
if (iResult == OBJECT_FOLDER)
{
*resultFolder = _ResultFolder;
}
}
return SUCCESS;
}
int executeCommand(char *command, char *minorArg, Folder *majorArgFolder, File *majorArgFile, int majorArgIsFolder, Folder *RootFolder, Folder **CurrentFolder)
{
if (!strcmp(command, "cd"))
{
if (!majorArgIsFolder)
{
return FAILURE;
}
*CurrentFolder = majorArgFolder;
return SUCCESS;
}
else if (!strcmp(command, "ls"))
{
Folder *PrintDirectory;
if (!majorArgIsFolder)
{
PrintDirectory = *CurrentFolder;
}
else
{
PrintDirectory = majorArgFolder;
}
if (!strcmp(minorArg, "-l"))
print_list(PrintDirectory, 1);
else
print_list(PrintDirectory, 0);
return SUCCESS;
}
else if (!strcmp(command, "rm"))
{
if (!majorArgIsFolder)
{
// Работаем с файлом, удаление MajorArgFile
delete_file(majorArgFile);
}
else
{
// Работаем с папкой, рекурсивное удаление MajorArgFolder
printf("=== %s\n", majorArgFolder->filename);
delete_folder(majorArgFolder);
}
return SUCCESS;
}
else if (!strcmp(command, "find"))
{
printf("FIND!\n");
char *buf = (char *)malloc(MAX_ARG_LEN);
char *fname = (char *)malloc(MAX_ARG_LEN);
char *ext = (char *)malloc(MAX_ARG_LEN);
int count = 0;
printf("MinorArg: %s\n", minorArg);
strcpy(buf, minorArg);
char *sep = ".";
char *istr = strtok(buf, sep);
while (istr != NULL)
{
if (count == 0)
{
strcpy(fname, istr);
count++;
}
else
{
strcpy(ext, istr);
count++;
break;
}
istr = strtok(NULL, sep);
}
printf("Count: %d\n", count);
if (count == 1)
{
printf("tryin to find folder\n");
find_folder(fname, majorArgFolder);
}
else
{
printf("tryin to find file\n");
find_file(fname, ext, majorArgFolder);
}
free(buf);
free(fname);
free(ext);
}
else if (!strcmp(command, "touch"))
{
char *buf = (char *)malloc(MAX_ARG_LEN);
char *fname = (char *)malloc(MAX_ARG_LEN);
char *ext = (char *)malloc(MAX_ARG_LEN);
int count = 0;
printf("MinorArg: %s\n", minorArg);
strcpy(buf, minorArg);
char *sep = ".";
char *istr = strtok(buf, sep);
while (istr != NULL)
{
if (count == 0)
{
strcpy(fname, istr);
count++;
}
else
{
strcpy(ext, istr);
count++;
break;
}
istr = strtok(NULL, sep);
}
addFile(fname, ext, *CurrentFolder);
free(buf);
free(fname);
free(ext);
}
else if (!strcmp(command, "mkdir"))
{
addFolder(minorArg, *CurrentFolder);
}
else
{
printf("Unknown command: %s", command);
return FAILURE;
}
return SUCCESS;
}
int commandParserHandler(char *input, Folder *RootFolder, Folder **CurrentFolder)
{
int result = SUCCESS; // Если что-то пойдет не так, то он изменится
char *sep = " ";
char *str = (char *)malloc(MAX_COMMAND_LEN), *istr;
int i = 0; // Счетчик обработанных лексемм
strcpy(str, input);
for (size_t i = 0; i < strlen(str); i++)
{
if (str[i] == '\n')
{
str[i] = ' ';
}
}
istr = strtok(str, sep);
char *command = (char *)malloc(MAX_COMMAND_LEN);
char *arg1 = (char *)malloc(MAX_COMMAND_LEN);
char *arg2 = (char *)malloc(MAX_COMMAND_LEN);
int optionFlag = 0;
int r1, r2;
File *ResultFile = NULL;
Folder *ResultFolder = NULL;
while (istr != NULL)
{
// Обрабатываем команду/аргумент
printf("%d\n", i);
switch (i)
{
case 0:
// команда
for (size_t i = 0; i < strlen(istr); i++)
{
if (istr[i] == '\n')
{
istr[i] = '\0';
}
}
if (checkCommandValid(istr)) // Если команда неправильная
{
printf("Incorrect Command!");
result = FAILURE;
goto cleanup;
}
strcpy(command, istr);
break;
case 1:
// аргумент 1
r1 = strcmp(command, "mkdir");
r2 = strcmp(command, "touch");
if (strcmp(command, "find") && r1 && r2)
{
if (checkArgumentValid(command, istr, RootFolder, *CurrentFolder, &ResultFolder, &ResultFile))
{
result = WRONG_OPTION;
goto cleanup;
}
if (istr[0] == '-')
optionFlag = 1;
}
else
{
if (!r1 || !r2)
{
optionFlag = 0;
}
else
optionFlag = 1;
}
strcpy(arg1, istr);
break;
case 2:
// аргумент 2
if (!optionFlag)
{
result = WRONG_ARGUMENT_FAILURE;
goto cleanup;
}
if (checkArgumentValid(command, istr, RootFolder, *CurrentFolder, &ResultFolder, &ResultFile))
{
result = WRONG_OPTION;
goto cleanup;
}
strcpy(arg2, istr);
break;
default:
break;
}
i++;
istr = strtok(NULL, sep); // Выделяем следующую часть
}
printf("%d: %s, %s, %s\n", i, command, arg1, arg2);
result = executeCommand(command, arg1, ResultFolder, ResultFile, ResultFolder != NULL, RootFolder, CurrentFolder);
// printf("- exec: %d", r);
cleanup:
free(str);
free(command);
free(arg1);
free(arg2);
return result;
}