From 91a2afb9fb91c56c5c79c8cb52ffdd2a28bd2948 Mon Sep 17 00:00:00 2001 From: Arseniy Date: Sun, 15 Jun 2025 03:02:12 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD?= =?UTF-8?q?=D1=8B=20=D1=84=D0=BB=D0=B0=D0=B3=D0=B8=20-j=20=D0=B8=20-r=20?= =?UTF-8?q?=D1=82=D0=B0=D0=BA=D0=B6=D0=B5=20=D0=B4=D0=B5=D0=BB=D0=B0.=20js?= =?UTF-8?q?on=20=D1=80=D0=B5=D0=BA=D1=83=D1=80=D1=81=D0=B8=D0=B2=D0=BD?= =?UTF-8?q?=D1=8B=D0=BC,=20=D0=BD=D0=BE=20=D0=BF=D1=80=D0=B8=20-r1=20?= =?UTF-8?q?=D0=B8=20=D0=B1=D0=BE=D0=BB=D0=B8=D0=B5=20=D0=B2=D1=81=D1=91=20?= =?UTF-8?q?=D0=BB=D0=BE=D0=BC=D0=B0=D0=B5=D1=82=D1=81=D1=8F.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.c | 196 +++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 143 insertions(+), 53 deletions(-) diff --git a/main.c b/main.c index 7e3e9fe..f2b3c97 100644 --- a/main.c +++ b/main.c @@ -6,13 +6,15 @@ #include #include +#include + #include #include "cJSON/cJSON.h" #define bool unsigned char -#define DEBUG 3 +#define DEBUG 1 #if defined(DEBUG) && DEBUG > 1 #define DEBUG_PRINT(fmt, args...) fprintf(stderr, "DEBUG: %s:%d:%s(): " fmt, \ @@ -103,15 +105,15 @@ struct metadata* metadata_create(bool tipe_dir,char* path, struct metadata* top) mata->size = mata->size; //struct metadata* mata_2 = mata; - + /* struct tred_pizdec* mata_2 = malloc(sizeof(struct tred_pizdec)); mata_2->name = path; mata_2->size = &mata->size; pthread_t thread; pthread_create(&thread, NULL, get_file_size_multi_tred, (void*)mata_2); //pthread_join(thread, NULL); - - //mata->size = get_file_size(path); + */ + mata->size = get_file_size(path); DEBUG_PRINT("Объём:%li - %s\n", mata->size, mata->name); } return mata; @@ -226,51 +228,19 @@ void load_cache(struct metadata** cache, int* cache_size) { } } -void json_create(){ - char* name = "TEST"; - int volume = 200; - /* - cJSON *device = cJSON_CreateObject(); - cJSON* devices = cJSON_CreateArray(); - cJSON *type = cJSON_CreateString(name); - cJSON_AddItemToObject(devices, "name", type); - cJSON_AddItemToObject(device, "list", devices); - cJSON* id = cJSON_CreateObject(); - cJSON_AddItemToArray(devices, id); - cJSON *value = cJSON_CreateNumber(volume); - //cJSON_AddItemToObject(devices, "volume", value); - char *string = cJSON_Print(device); - */ - //printf("AA: %s\n", string); +void json_create(cJSON *main_Array, char* name, long int volume, cJSON *content_Array){ + cJSON *main_ob = cJSON_CreateObject(); + cJSON_AddItemToArray(main_Array, main_ob); + cJSON *name_js = cJSON_CreateString(name); + cJSON_AddItemToObject(main_ob, "name", name_js); + cJSON *volume_js = cJSON_CreateNumber(volume); + cJSON_AddItemToObject(main_ob, "volume", volume_js); + cJSON_AddItemToObject(main_ob, "content", content_Array); } - -int main(int argc, char *argv[]){ // /home/romenskiy2012/ - char *path; - setlocale(LC_ALL, ""); - //printf("Your locale is: %s\n", setlocale(LC_CTYPE, NULL)); - if (argc == 2){ - path = argv[1]; - //printf("ZZZZ %s\n", path); - } - else{ - if (!strcmp (setlocale(LC_CTYPE, NULL), "ru_RU.UTF-8")){ - printf("Путь не указан!\n"); - } - else printf("The path is not specified!\n"); - return 0; - } - //char *path = malloc(sizeof(char)* (argc+1)); - //path = argv; - //char path[] = "/home/romenskiy2012/projects/WebDisk/SAS/"; // /home/romenskiy2012/projects/WebDisk/SAS/ - //char name[] = "SAS"; - struct metadata *mata, *meta_data, *meta_data_tmp; - mata = malloc(sizeof(stack_element)); - mata->name = path; - mata->tipe_dir = 1; - scanning(mata); - +void scan_dir(struct metadata *mata){ + struct metadata *meta_data, *meta_data_tmp; meta_data = mata; if (meta_data->dir_list == NULL) meta_data->jamp = meta_data->dir_list; @@ -320,24 +290,144 @@ int main(int argc, char *argv[]){ // /home/romenskiy2012/ meta_data = meta_data->top; } } - //if (mata == meta_data){ - // break; - //} } DEBUG_PRINT("Готово!\n"); - struct dir_list_struct* list = mata->dir_list; - DEBUG_PRINT("list получен!\n"); - char output[64]; +} + +typedef struct { + bool has_j; + bool has_r; + int r_value; + char path[1024]; +} Options; + +bool parse_args(int argc, char *argv[], Options *opts) { + opts->has_j = 0; + opts->has_r = 0; + opts->r_value = 0; + opts->path[0] = '\0'; + + for (int i = 1; i < argc; i++) { + char *arg = argv[i]; + + if (arg[0] == '-') { + // Обрабатываем каждый символ после '-' + for (int j = 1; arg[j] != '\0'; j++) { + if (arg[j] == 'j') { + opts->has_j = 1; + } else if (arg[j] == 'r') { + opts->has_r = 1; + + // Проверка: есть ли сразу число после 'r' + if (isdigit((unsigned char)arg[j + 1])) { + opts->r_value = atoi(&arg[j + 1]); + break; // всё остальное — часть числа, не флаг + } else if (i + 1 < argc) { + // Иначе, число должно быть в следующем аргументе + opts->r_value = atoi(argv[++i]); + break; + } else { + fprintf(stderr, "Ошибка: -r требует числовой аргумент\n"); + return 0; + } + } else { + fprintf(stderr, "Неизвестный флаг: -%c\n", arg[j]); + return 0; + } + } + } else { + // Первый аргумент без '-' — путь + if (opts->path[0] == '\0') { + strncpy(opts->path, arg, sizeof(opts->path) - 1); + opts->path[sizeof(opts->path) - 1] = '\0'; + } else { + fprintf(stderr, "Ошибка: путь уже указан\n"); + return 0; + } + } + } + + if (opts->path[0] == '\0') { + fprintf(stderr, "Ошибка: путь не указан\n"); + return 0; + } + + return 1; +} + +bool js_logok, int_depth=0; + +cJSON *print_statistik(cJSON *main_Array, struct dir_list_struct* list, char* output, int i){ + //cJSON *main_Array = cJSON_CreateArray(); + cJSON *content_Array; do{ format_size(list->file->size, output, sizeof(output)); printf("%s\t%li\t%s\n", output, list->file->size, list->file->name); + if (js_logok){ + if (list->file->tipe_dir && (list->file->dir_list != NULL) && (int_depth != i)){ + DEBUG_PRINT("Рекурсируем!\n"); + DEBUG_PRINT("Каталог вниз: %s!\n", list->file->name); + DEBUG_PRINT("Глубина: %i!\n", i); + content_Array = print_statistik(main_Array, list->file->dir_list, output, ++i); + printf("AA: %s\n", cJSON_Print(content_Array)); + DEBUG_PRINT("Верх!\n"); + } + else{ + DEBUG_PRINT("Конец рекурсии!\n"); + content_Array = cJSON_CreateArray(); + + } + DEBUG_PRINT("json_create main_Array!\n"); + DEBUG_PRINT("Имя: %s!\n", list->file->name); + printf("До: %s\n", cJSON_Print(main_Array)); + json_create(main_Array, list->file->name, list->file->size, content_Array); + printf("После: %s\n", cJSON_Print(main_Array)); + + } DEBUG_PRINT("прыгаем_1!\n"); list = list->next; DEBUG_PRINT("прыгаем_2!\n"); }while(list != NULL); + return main_Array; +} + +int main(int argc, char *argv[]){ // /home/romenskiy2012/ + char *path; + setlocale(LC_ALL, ""); + //printf("Your locale is: %s\n", setlocale(LC_CTYPE, NULL)); + Options opts; + if (!parse_args(argc, argv, &opts)) { + return 1; + } + + printf("Путь: %s\n", opts.path); + printf("Флаг -j: %s\n", opts.has_j ? "да" : "нет"); + if (opts.has_r) { + printf("Флаг -r: да, значение: %d\n", opts.r_value); + } else { + printf("Флаг -r: нет\n"); + } + js_logok = opts.has_j; + int_depth= opts.r_value; + path = opts.path; + + struct metadata * mata = malloc(sizeof(stack_element)); + mata->name = path; + mata->tipe_dir = 1; + scanning(mata); + scan_dir(mata); + + char output[64]; + struct dir_list_struct* list = mata->dir_list; + cJSON *main_Array = cJSON_CreateArray(); + main_Array = print_statistik(main_Array, list, output, 0); + //while(list->next != NULL); //save_cache(mata, int cache_size) + DEBUG_PRINT("ПППП!\n"); + char *string = cJSON_Print(main_Array); + DEBUG_PRINT("ччччч!\n"); + printf("AA: %s\n", string); printf("%s","bye.\n"); - json_create(); return 0; }