From c604be20f1cddfa87ddce8d00a5888c3ed6ba94f Mon Sep 17 00:00:00 2001 From: root Date: Sun, 29 May 2022 17:46:21 +0300 Subject: [PATCH] Ready for Gera --- .vscode/settings.json | 5 +- config.h | 19 ++- main.c | 76 +++++++----- structs.c | 264 +++++++++++++++++++++++++++--------------- structs.h | 55 +++++---- work1 | Bin 13208 -> 17456 bytes 6 files changed, 258 insertions(+), 161 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 65e1ec0..ed0de2b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,6 @@ { - "makefile.extensionOutputFolder": "./.vscode" + "makefile.extensionOutputFolder": "./.vscode", + "files.associations": { + "config.h": "c" + } } \ No newline at end of file diff --git a/config.h b/config.h index b507727..a52738a 100644 --- a/config.h +++ b/config.h @@ -15,13 +15,6 @@ #include // input console checking -#define HELP_CONSOLE_OPTION_1 "-h" -#define HELP_CONSOLE_OPTION_2 "--help" -#define GENKEY_CONSOLE_OPTION "genkey" -#define SIGNATURE_CONSOLE_OPTION "sign" -#define CHECK_CONSOLE_OPTION "check" -#define ENCRYPT_CONSOLE_OPTION "encrypt" -#define DECRYPT_CONSOLE_OPTION "decrypt" // boolean #define BOOL int @@ -34,7 +27,8 @@ /// /// Error codes /// -typedef enum { +typedef enum +{ SUCCESS, FAILURE, NO_ARGUMENTS_FAILURE, @@ -45,14 +39,19 @@ typedef enum { FILENAME_SYMBOL_FAILURE, FILENAME_ENDING_FAILURE, FORMAT_FAILURE, + EXISTING_NAME_FAILURE, DEBUG_EXIT_CODE = 100 } ERROR_CODE; // fast funcs -#define swap(a,b); b = a+b; a = b-a; b = b-a; +#define swap(a, b) \ + ; \ + b = a + b; \ + a = b - a; \ + b = b - a; #ifdef _WIN32 #else -#define max(a,b) (a>b)? a : b +#define max(a, b) (a > b) ? a : b #endif #endif // !CONFIG_H \ No newline at end of file diff --git a/main.c b/main.c index 2afabd4..c22f234 100644 --- a/main.c +++ b/main.c @@ -1,48 +1,62 @@ #include "structs.h" - +#include int main() { + int i; File new_file; Folder new_folder; - createFile("file1", "hehe", &new_file); createFolder("root", &new_folder); - printf("%s\n", new_file.creation_time); - printf("%s\n", new_file.filename); - printf("%s\n", new_file.extension); - - - - printf("\n%s\n", new_folder.creation_time); - printf("%s\n", new_folder.filename); - printf("%d\n", new_folder.folders_count_cur); - printf("%d\n", new_folder.files_count_cur); - printf("%d\n", new_folder.files_count_max); - printf("%d\n", new_folder.folders_count_max); - - printf("%d\n", new_folder.exists_into); - - - printf("\n%d\n", addFolder("sos", &new_folder)); - printf("%d\n", new_folder.exists_into); + /*printf("%d\n", new_folder.exists_into); printf("%d\n", new_folder.folders_count_cur); printf("%d\n", new_folder.files_count_cur); printf("%d\n", new_folder.files_count_max); printf("%d\n", new_folder.folders_count_max); printf("%s\n", new_folder.folders[0].creation_time); printf("%s\n", new_folder.folders[0].filename); - - - printf("\n%d\n", addFolder("sos2", &new_folder)); - printf("%d\n", new_folder.exists_into); - printf("%d\n", new_folder.folders_count_cur); - printf("%d\n", new_folder.files_count_cur); - printf("%d\n", new_folder.files_count_max); - printf("%d\n", new_folder.folders_count_max); - printf("%s\n", new_folder.folders[1].creation_time); - printf("%s\n", new_folder.folders[1].filename); + */ - printf("%-*d%-*d%-*d\n", 10, 1376513765, 10, 123, 10, 1874); + printf("\n%d\n", addFolder("sos2", &new_folder)); + // printf("%d\n", new_folder.exists_into); + // printf("%d\n", new_folder.folders_count_cur); + // printf("%d\n", new_folder.files_count_cur); + // printf("%d\n", new_folder.files_count_max); + // printf("%d\n", new_folder.folders_count_max); + printf("%s\n", new_folder.folders[1].creation_time); + // printf("%s\n", new_folder.folders[1].filename); + + // char name[10]; + // for (i = 0; i < 400; i++) + // { + // sprintf(name, "%d", i); + // if (i % 2) + // { + // printf("\ni = %d : %d\n", i, addFile(name, "test", &new_folder)); + // } + // else + // { + // printf("\ni = %d : %d\n", i, addFolder(name, &new_folder)); + // } + // printf("%d\n", new_folder.exists_into); + // printf("%d\n", new_folder.folders_count_cur); + // printf("%d\n", new_folder.folders_count_max); + // printf("%d\n", new_folder.files_count_cur); + // printf("%d\n", new_folder.files_count_max); + // } + + addFile("file1", "hehe", &new_folder); + addFile("file1", "hehe", &new_folder); + addFile("file1", "huh", &new_folder); + addFile("trash", "hehe", &new_folder); + addFile("AvadaBlyad Kedavra", "huy", &new_folder); + addFile("Ya v svoyom poznanii nastolko preispolnilsya", "budtobi3", &new_folder); + addFolder("Uh suka so smislam", &new_folder); + addFolder("Ya v svoyom poznanii nastolko preispolnilsya", &new_folder); + addFolder("Ya v svoyom poznanii nastolko preispolnilsya", &new_folder); + + // printf("%-*d%-*d%-*d\n", 10, 1376513765, 10, 123, 10, 1874); + + print_list(&new_folder, 1); return SUCCESS; } diff --git a/structs.c b/structs.c index 9756543..2272e4d 100644 --- a/structs.c +++ b/structs.c @@ -1,70 +1,99 @@ #include "structs.h" -int check_name(char* name) +int check_name(char *name) { int strln = strlen(name); int i; - char* symb; + char *symb; - if(strln > filename_lenth) + if (strln > filename_lenth) return FILENAME_LENGTH_FAILURE; - - for(i = 0; i < strln; i ++) + + for (i = 0; i < strln; i++) { - symb = strchr(right_symb, name[i]); - if(symb == 0) + symb = strchr(right_symb_name, name[i]); + if (symb == 0) return FILENAME_SYMBOL_FAILURE; } - if(name[strln-1] == '.') + if (name[strln - 1] == '.') return FILENAME_ENDING_FAILURE; return SUCCESS; } -int createFile(char* file_name, char* extension, File* file) +int check_ext(char *ext) +{ + int strln = strlen(ext); + int i; + char *symb; + + if (strln > extinsion_lenth) + return FILENAME_LENGTH_FAILURE; + + for (i = 0; i < strln; i++) + { + symb = strchr(right_symb_ext, ext[i]); + if (symb == 0) + return FILENAME_SYMBOL_FAILURE; + } + + if (ext[strln - 1] == '.') + return FILENAME_ENDING_FAILURE; + + return SUCCESS; +} + +int createFile(char *file_name, char *extension, File *file) { ERROR_CODE errno; time_t time_now; - struct tm* time_info; - File result = {"\0","\0","\0"}; + struct tm *time_info; + File result = {"\0", "\0", "\0"}; time(&time_now); time_info = localtime(&time_now); - strftime (result.creation_time,creation_time_length,"%T %D",time_info); + strftime(result.creation_time, creation_time_length, "%T %D", time_info); + strftime(result.creation_date, creation_time_length, "%D ", time_info); - if((errno = check_name(file_name)) != SUCCESS) + if ((errno = check_name(file_name)) != SUCCESS) return errno; - + + if ((errno = check_ext(extension)) != SUCCESS) + return errno; + strcpy(result.filename, file_name); strcpy(result.extension, extension); *file = result; + + return SUCCESS; } -int createFolder(char* folder_name, Folder* folder) +int createFolder(char *folder_name, Folder *folder) { ERROR_CODE errno; time_t time_now; - struct tm* time_info; - Folder result = {0, 0, 1, 1, 0, "\0","\0"}; - - if((errno = check_name(folder_name)) != SUCCESS) + struct tm *time_info; + Folder result = {0, 0, 1, 1, 0, "\0", "\0"}; + + if ((errno = check_name(folder_name)) != SUCCESS) return errno; - + strcpy(result.filename, folder_name); time(&time_now); time_info = localtime(&time_now); - strftime (result.creation_time,creation_time_length,"%T %D",time_info); + strftime(result.creation_time, creation_time_length, "%T %D", time_info); + strftime(result.creation_date, creation_time_length, "%D ", time_info); - result.files = (File*) malloc(sizeof(File)); - result.folders = (Folder*) malloc(sizeof(Folder)); + result.files = (File *)malloc(sizeof(File)); + result.folders = (Folder *)malloc(sizeof(Folder)); - if(result.files == NULL || result.folders == NULL) + if (result.files == NULL || result.folders == NULL) return MEMORY_ALLOCATION_FAILURE; *folder = result; @@ -72,87 +101,130 @@ int createFolder(char* folder_name, Folder* folder) return SUCCESS; } -int addFolder(char* folder_name, Folder* fld) +int addFolder(char *folder_name, Folder *fld) { - int errno, i; - Folder newFolder; - Folder* buffer; - - errno = createFolder(folder_name, &newFolder); - if(errno != SUCCESS) - return errno; - - fld->folders[fld->folders_count_cur] = newFolder; - fld->exists_into++; - fld->folders_count_cur++; - - if(fld->folders_count_cur == fld->folders_count_max) + if (fld->exists_into < MAX_EXIST_OBJ) { - fld->folders_count_max <<= 1; - buffer = (Folder*)malloc(sizeof(Folder) * (fld->folders_count_cur)); - if(buffer == NULL) - return MEMORY_ALLOCATION_FAILURE; - for (i = 0; i < fld->folders_count_cur; ++i) - { - buffer[i] = fld->folders[i]; - } - free(fld->folders); - fld->folders = (Folder*)malloc(sizeof(Folder) * (fld->folders_count_max)); - if(fld->folders == NULL) - return MEMORY_ALLOCATION_FAILURE; - for (i = 0; i < fld->folders_count_cur; ++i) - { - fld->folders[i] = buffer[i]; - } - free(buffer); + int errno, i; + Folder newFolder; + Folder *buffer; + + for (i = 0; i < fld->folders_count_cur; i++) + { + if (!strcmp(folder_name, fld->folders[i].filename)) + return EXISTING_NAME_FAILURE; + } + + errno = createFolder(folder_name, &newFolder); + if (errno != SUCCESS) + return errno; + + fld->folders[fld->folders_count_cur] = newFolder; + fld->exists_into++; + fld->folders_count_cur++; + + if (fld->folders_count_cur == fld->folders_count_max) + { + fld->folders_count_max <<= 1; + buffer = (Folder *)malloc(sizeof(Folder) * (fld->folders_count_cur)); + if (buffer == NULL) + return MEMORY_ALLOCATION_FAILURE; + for (i = 0; i < fld->folders_count_cur; ++i) + { + buffer[i] = fld->folders[i]; + } + free(fld->folders); + fld->folders = (Folder *)malloc(sizeof(Folder) * (fld->folders_count_max)); + if (fld->folders == NULL) + return MEMORY_ALLOCATION_FAILURE; + for (i = 0; i < fld->folders_count_cur; ++i) + { + fld->folders[i] = buffer[i]; + } + free(buffer); + } + + fld->folders[fld->folders_count_cur].parent = fld; + + return SUCCESS; } - - fld->folders[fld->folders_count_cur].parent = fld; - - return SUCCESS; } -int addFile(char* file_name, char* extension, Folder* fld) +int addFile(char *file_name, char *extension, Folder *fld) { - int errno, i; - File newFile; - File* buffer; - - errno = createFile(file_name, extension, &newFile); - if(errno != SUCCESS) - return errno; - - fld->files[fld->files_count_cur] = newFile; - fld->exists_into++; - fld->files_count_cur++; - - if(fld->files_count_cur == fld->files_count_max) + if (fld->exists_into < MAX_EXIST_OBJ) { - fld->files_count_max <<= 1; - buffer = (File*)malloc(sizeof(File) * (fld->files_count_cur)); - if(buffer == NULL) - return MEMORY_ALLOCATION_FAILURE; - for (i = 0; i < fld->files_count_cur; ++i) - { - buffer[i] = fld->files[i]; - } - free(fld->files); - fld->files = (File*)malloc(sizeof(File) * (fld->files_count_max)); - if(fld->files == NULL) - return MEMORY_ALLOCATION_FAILURE; - for (i = 0; i < fld->files_count_cur; ++i) - { - fld->files[i] = buffer[i]; - } - free(buffer); + int errno, i; + File newFile; + File *buffer; + + for (i = 0; i < fld->files_count_cur; i++) + { + if (!strcmp(extension, fld->files[i].extension) && !strcmp(file_name, fld->files[i].filename)) + return EXISTING_NAME_FAILURE; + } + + errno = createFile(file_name, extension, &newFile); + if (errno != SUCCESS) + return errno; + + fld->files[fld->files_count_cur] = newFile; + fld->exists_into++; + fld->files_count_cur++; + + if (fld->files_count_cur == fld->files_count_max) + { + fld->files_count_max <<= 1; + buffer = (File *)malloc(sizeof(File) * (fld->files_count_cur)); + if (buffer == NULL) + return MEMORY_ALLOCATION_FAILURE; + for (i = 0; i < fld->files_count_cur; ++i) + { + buffer[i] = fld->files[i]; + } + free(fld->files); + fld->files = (File *)malloc(sizeof(File) * (fld->files_count_max)); + if (fld->files == NULL) + return MEMORY_ALLOCATION_FAILURE; + for (i = 0; i < fld->files_count_cur; ++i) + { + fld->files[i] = buffer[i]; + } + free(buffer); + } + + fld->files[fld->files_count_cur].parent = fld; + + return SUCCESS; } - - fld->files[fld->files_count_cur].parent = fld; - - return SUCCESS; } -int print_list(Folder* fld) +int print_list(Folder *fld, int mode) { - + int i; // iterator + + if (mode == 0) // simple + { + printf("Files:\n"); + for (i = 0; i < fld->files_count_cur; i++) + printf("%*s.%-*s\n", filename_lenth, fld->files[i].filename, extinsion_lenth, fld->files[i].extension); + printf("Folders:\n"); + for (i = 0; i < fld->folders_count_cur; i++) + printf("%*s\n", filename_lenth, fld->folders[i].filename); + } + if (mode == 1) // not simple + { + printf("┌──────────┬──────────┬────────────────────────────────────────────────────┬────────────┐\n"); + printf("│ Time │ Date │ Filenames │ Extension │\n"); + printf("├──────────┼──────────┼────────────────────────────────────────────────────┼────────────┤\n"); + + for (i = 0; i < fld->files_count_cur; i++) + printf("│ %s│ %s│ %*s │ %*s │\n", fld->files[i].creation_time, fld->files[i].creation_date, filename_lenth, fld->files[i].filename, extinsion_lenth, fld->files[i].extension); + printf("├──────────┼──────────┼────────────────────────────────────────────────────┼────────────┘\n"); + printf("│ Time │ Date │ Foldernames │\n"); + printf("├──────────┼──────────┼────────────────────────────────────────────────────┤\n"); + for (i = 0; i < fld->folders_count_cur; i++) + printf("│ %s│ %s│ %*s │\n", fld->folders[i].creation_time, fld->folders[i].creation_date, filename_lenth, fld->folders[i].filename); + printf("└──────────┴──────────┴────────────────────────────────────────────────────┘\n"); + } } diff --git a/structs.h b/structs.h index 667aea4..511fdee 100644 --- a/structs.h +++ b/structs.h @@ -3,38 +3,47 @@ #include "config.h" -static const char right_symb[] = " qwertyuiop[]{}asdfghjkl;zxcvbnm,.?!@~`#№$%^&()+-0123456789"; +#define MAX_EXIST_OBJ 255 + +static const char right_symb_name[] = " QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiop[]{}asdfghjkl;zxcvbnm,.?!@~`#№$%^&()+-0123456789"; +static const char right_symb_ext[] = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm0123456789"; #define extinsion_lenth 10 #define filename_lenth 50 #define creation_time_length 17 -typedef struct _File{ - char creation_time[creation_time_length+1]; - char filename[filename_lenth+1]; - char extension[extinsion_lenth+1]; - struct _Folder* parent; -}File; +typedef struct _File +{ + char creation_time[creation_time_length + 1]; + char creation_date[creation_time_length + 1]; + char filename[filename_lenth + 1]; + char extension[extinsion_lenth + 1]; + struct _Folder *parent; +} File; -int createFile(char* file_name, char* extension, File* file); +int createFile(char *file_name, char *extension, File *file); -typedef struct _Folder{ - uint8_t files_count_cur; - uint8_t folders_count_cur; - uint8_t files_count_max; - uint8_t folders_count_max; - uint8_t exists_into; - char creation_time[creation_time_length+1]; - char filename[filename_lenth+1]; - File* files; - struct _Folder* folders; - struct _Folder* parent; -}Folder; +typedef struct _Folder +{ + uint16_t files_count_cur; + uint16_t folders_count_cur; + uint16_t files_count_max; + uint16_t folders_count_max; + uint16_t exists_into; + char creation_time[creation_time_length + 1]; + char creation_date[creation_time_length + 1]; + char filename[filename_lenth + 1]; + File *files; + struct _Folder *folders; + struct _Folder *parent; +} Folder; -int createFolder(char* folder_name, Folder* folder); +int createFolder(char *folder_name, Folder *folder); -int addFolder(char* folder_name, Folder* fld); +int addFolder(char *folder_name, Folder *fld); -int addFile(char* file_name, char* extension, Folder* fld); +int addFile(char *file_name, char *extension, Folder *fld); + +int print_list(Folder *fld, int mode); #endif \ No newline at end of file diff --git a/work1 b/work1 index c3b7401043dde5ae155394700571760085f80864..608367dd31c04ba24885b3915afdc67cb6edf536 100755 GIT binary patch literal 17456 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 mRH(#gGC`nP;RNvQWrmQLHxl>Y(65`-}T