Доделаны флаги -j и -r также дела. json рекурсивным, но при -r1 и болие всё ломается.

This commit is contained in:
Arseniy Romenskiy 2025-06-15 03:02:12 +03:00
parent 42610bdb02
commit 91a2afb9fb

196
main.c
View file

@ -6,13 +6,15 @@
#include <errno.h> #include <errno.h>
#include <locale.h> #include <locale.h>
#include <ctype.h>
#include <pthread.h> #include <pthread.h>
#include "cJSON/cJSON.h" #include "cJSON/cJSON.h"
#define bool unsigned char #define bool unsigned char
#define DEBUG 3 #define DEBUG 1
#if defined(DEBUG) && DEBUG > 1 #if defined(DEBUG) && DEBUG > 1
#define DEBUG_PRINT(fmt, args...) fprintf(stderr, "DEBUG: %s:%d:%s(): " fmt, \ #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; mata->size = mata->size;
//struct metadata* mata_2 = mata; //struct metadata* mata_2 = mata;
/*
struct tred_pizdec* mata_2 = malloc(sizeof(struct tred_pizdec)); struct tred_pizdec* mata_2 = malloc(sizeof(struct tred_pizdec));
mata_2->name = path; mata_2->name = path;
mata_2->size = &mata->size; mata_2->size = &mata->size;
pthread_t thread; pthread_t thread;
pthread_create(&thread, NULL, get_file_size_multi_tred, (void*)mata_2); pthread_create(&thread, NULL, get_file_size_multi_tred, (void*)mata_2);
//pthread_join(thread, NULL); //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); DEBUG_PRINT("Объём:%li - %s\n", mata->size, mata->name);
} }
return mata; return mata;
@ -226,51 +228,19 @@ void load_cache(struct metadata** cache, int* cache_size) {
} }
} }
void json_create(){ void json_create(cJSON *main_Array, char* name, long int volume, cJSON *content_Array){
char* name = "TEST"; cJSON *main_ob = cJSON_CreateObject();
int volume = 200; cJSON_AddItemToArray(main_Array, main_ob);
/* cJSON *name_js = cJSON_CreateString(name);
cJSON *device = cJSON_CreateObject(); cJSON_AddItemToObject(main_ob, "name", name_js);
cJSON* devices = cJSON_CreateArray(); cJSON *volume_js = cJSON_CreateNumber(volume);
cJSON *type = cJSON_CreateString(name); cJSON_AddItemToObject(main_ob, "volume", volume_js);
cJSON_AddItemToObject(devices, "name", type); cJSON_AddItemToObject(main_ob, "content", content_Array);
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 scan_dir(struct metadata *mata){
int main(int argc, char *argv[]){ // /home/romenskiy2012/ struct metadata *meta_data, *meta_data_tmp;
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);
meta_data = mata; meta_data = mata;
if (meta_data->dir_list == NULL) if (meta_data->dir_list == NULL)
meta_data->jamp = meta_data->dir_list; meta_data->jamp = meta_data->dir_list;
@ -320,24 +290,144 @@ int main(int argc, char *argv[]){ // /home/romenskiy2012/
meta_data = meta_data->top; meta_data = meta_data->top;
} }
} }
//if (mata == meta_data){
// break;
//}
} }
DEBUG_PRINT("Готово!\n"); 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{ do{
format_size(list->file->size, output, sizeof(output)); format_size(list->file->size, output, sizeof(output));
printf("%s\t%li\t%s\n", output, list->file->size, list->file->name); 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"); DEBUG_PRINT("прыгаем_1!\n");
list = list->next; list = list->next;
DEBUG_PRINT("прыгаем_2!\n"); DEBUG_PRINT("прыгаем_2!\n");
}while(list != NULL); }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); //while(list->next != NULL);
//save_cache(mata, int cache_size) //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"); printf("%s","bye.\n");
json_create();
return 0; return 0;
} }