diff --git a/.gitignore b/.gitignore index 300ae2b..6337e4a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,6 @@ build/ *~ WebDisk_C.kdev4 .cache - +jemalloc/ diff --git a/file.h b/file.h index 22e29ec..b11857f 100644 --- a/file.h +++ b/file.h @@ -47,6 +47,7 @@ void serialize_tree(Node *node, FILE *f_struct, FILE *f_names, uint64_t *names_o fwrite(&end, 1, 1, f_struct); // Маркер конца детей } */ +// xxd -p -c 1 nodes.bin | awk '{printf "%s", $0; if (tolower($0)=="ff") printf "\n"; else printf " "}' | perl -pe 's/fe/\e[31m$&\e[0m/g' | sed $'s/ff/\x1b[32m&\x1b[0m/g' #define DOWN_MARKER 0xFE #define END_MARKER 0xFF struct metadata_file { @@ -69,6 +70,8 @@ void nodes_file_w(struct metadata* meta, FILE * f_nodes, uint64_t *nodes_offset, *nodes_offset += sizeof(struct metadata_file); } + + void aaasss(struct dir_list_struct* dir_list, struct metadata* mata_local, struct metadata* mata_local_top, FILE *f_nodes, FILE *f_names, int* marker, uint16_t* len){ if (NULL != dir_list->file){ DEBUG_PRINT("НЕ dir_list->file\n"); @@ -88,12 +91,144 @@ void aaasss(struct dir_list_struct* dir_list, struct metadata* mata_local, struc fread(mata_local->name, 1, *len, f_names); DEBUG_PRINT("Файл: %s\n", mata_local->name); // Дальше обработка структуры... - dir_list->top = mata_local_top; mata_local->top = mata_local_top; dir_list->file = mata_local; *marker = fgetc(f_nodes); } +void write_optject(struct metadata* mata_local, FILE *f_nodes, FILE *f_names, int* marker, uint16_t* len){ + ungetc(*marker, f_nodes); // возвращаем байт обратно + struct metadata_file file; + fread(&file, sizeof(file), 1, f_nodes); + mata_local->size = file.size; + mata_local->tipe_dir = file.tipe_dir; + mata_local->dir_list = NULL; + fread(len, 1, sizeof(uint16_t), f_names); + mata_local->name = malloc(*len+1); + fread(mata_local->name, 1, *len, f_names); + DEBUG_PRINT("Файл: %s\n", mata_local->name); + +} void nanaaa_2(struct metadata* mata){ + FILE *f_nodes = fopen("nodes.bin", "rb"); + FILE *f_names = fopen("names.bin", "rb"); + uint16_t len; + struct dir_list_struct* dir_list_L = je_malloc(sizeof(struct dir_list_struct)); + struct dir_list_struct** dir_list = &mata->dir_list; + struct dir_list_struct* dir_list_daun = je_malloc(sizeof(struct dir_list_struct)); + struct metadata* mata_local = mata; + struct metadata* mata_local_top = mata; + int marker = fgetc(f_nodes); + //if (marker == EOF) return; + //write_optject(mata_local, f_nodes, f_names, &marker, &len); + mata_local->dir_list = NULL; + mata_local->top = NULL; + mata_local->jamp = NULL; + //marker = fgetc(f_nodes); + while(marker != EOF){ + if (marker == END_MARKER){ // 0xFF + DEBUG_PRINT("=0xFF=\n"); + printf("mata_local : %s\n", mata_local->name); + //printf("dir_list: %s\n", mata_local->dir_list->file->name); + printf("mata_local_top: %s\n", mata_local_top->name); + //printf("dir_list_daun: %s\n", dir_list_daun->file->name); + //dir_list = mata_local->jamp; + if(mata_local->top != NULL) + mata_local = mata_local->top; + //dir_list = mata_local->jamp; + if(mata_local->jamp != NULL){ + dir_list = &mata_local->jamp; + //dir_list_daun = mata_local->top->jamp; + } + else{ + //dir_list_daun = dir_list; + dir_list = NULL; + } + if(mata_local_top->top != NULL) + mata_local_top = mata_local_top->top; + else mata_local_top = NULL; + printf("x mata_local : %s\n", mata_local->name); + //printf("xx mata_local: %s\n", mata_local->top->name); + //printf("x dir_list: %s\n", dir_list->file->name); + printf("x mata_local_top: %s\n", mata_local_top->name); + //printf("x dir_list_daun: %s\n", dir_list_daun->file->name); + + }else{ + DEBUG_PRINT("FAIL\n"); + struct metadata* mata_local_next = malloc(sizeof(struct metadata)); + write_optject(mata_local_next, f_nodes, f_names, &marker, &len); + if(mata_local_top->dir_list == NULL){// Есл. 1 эл. + DEBUG_PRINT("Есл. 1 эл.!!!\n"); + mata_local->dir_list = je_malloc(sizeof(struct dir_list_struct)); + mata_local->dir_list->file = mata_local_next; + mata_local->dir_list->next = NULL; + //dir_list = &mata_local_next->dir_list; + //mata_local_next->jamp = mata_local->dir_list; + mata_local_next->jamp = *dir_list; + dir_list = &(*dir_list)->next; + //mata_local = mata_local_next; + //mata_local_top = mata_local_next; + mata_local_next->top = mata_local_top; + + //if(mata_local_next->top->dir_list == mata_local_top->dir_list && mata_local->top != NULL) + if(mata_local->top != NULL){ + printf("cv mata_local_next: %s\n", mata_local_next->name); + printf("cv mata_local_top : %s\n", mata_local_top->name); + printf("cv mata_local : %s\n", mata_local->name); + //if() + printf("cv mata_local_next top : %s\n", mata_local_next->top->name); + printf("cv mata_local_top dir_list : %s\n", mata_local_top->dir_list->file->name); + //printf("cv mata_local_next dir_list file : %s\n", mata_local_next->dir_list->file->name); + mata_local_top = mata_local; + //mata_local_top = mata_local_top->dir_list->file; + //mata_local_top = mata_local_top->top; + } + mata_local_next->top = mata_local_top; + } + else{// Есл очередной эл. + DEBUG_PRINT("Есл очередной эл.!!!\n"); + if(true){ + printf("cvx mata_local_next: %s\n", mata_local_next->name); + printf("cvx mata_local_top : %s\n", mata_local_top->name); + printf("cvx mata_local : %s\n", mata_local->name); + //printf("cvx mata_local_next top : %s\n", mata_local_next->top->name); + //mata_local_top = mata_local; + } + mata_local_next->top = mata_local_top; + //mata_local_next->top = mata_local; + //mata_local_next->top = mata_local_top; // !!!!!!!!!!!!!! + DEBUG_PRINT("AAAASSSS!!!\n"); + //dir_list[0]->next = je_malloc(sizeof(struct dir_list_struct)); + + *dir_list = je_malloc(sizeof **dir_list); + (*dir_list)->next = NULL; + (*dir_list)->file = mata_local_next; + //dir_list->next = je_malloc(sizeof(struct dir_list_struct)); + DEBUG_PRINT("AAAASSSS2!!!\n"); + //if(mata_local_next->tipe_dir) + mata_local_next->dir_list = NULL; /// !!!!!!!!!! + //mata_local->dir_list = mata_local->dir_list->next; + //mata_local->dir_list->file = mata_local_next; + //dir_list = &mata_local->jamp; + mata_local_next->jamp = *dir_list; + dir_list = &(*dir_list)->next; + //dir_list = &mata_local_next->dir_list; + //mata_local_next->jamp = mata_local->dir_list->next; + + } + mata_local = mata_local_next; + printf("vv mata_local : %s\n", mata_local->name); + printf("vv mata_local_top: %s\n", mata_local_top->name); + + DEBUG_PRINT("NN - %s\n", mata_local->name); + //DEBUG_PRINT("NN size - %li\n", mata_local->size); + DEBUG_PRINT("NN - %i\n", marker); + } + marker = fgetc(f_nodes); + } + DEBUG_PRINT("ВСЁ!!!\n"); +} + +void nanaaa_22(struct metadata* mata){ FILE *f_nodes = fopen("nodes.bin", "rb"); FILE *f_names = fopen("names.bin", "rb"); struct metadata_file file, file_2; @@ -177,6 +312,10 @@ void nanaaa(struct metadata* mata){ meta_data = mata; if (meta_data->dir_list == NULL) meta_data->jamp = meta_data->dir_list; + DEBUG_PRINT("AAAAAAAAAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@: %s\n",mata->name); + nodes_file_w(mata, f_nodes, &nodes_offset, names_offset); + name_file_w(mata->name, f_names, &names_offset); + //fputc(DOWN_MARKER, f_nodes); struct dir_list_struct* global_dir_list = meta_data->dir_list; while(1){ DEBUG_PRINT("Цикол!\n"); @@ -194,7 +333,7 @@ void nanaaa(struct metadata* mata){ nodes_file_w(meta_data, f_nodes, &nodes_offset, names_offset); name_file_w(meta_data->name, f_names, &names_offset); //fwrite(meta_data->name, 1, sizeof(struct metadata), f_names); - fputc(DOWN_MARKER, f_nodes); + //fputc(DOWN_MARKER, f_nodes); break; } else{ @@ -226,6 +365,7 @@ void nanaaa(struct metadata* mata){ } } } + fputc(END_MARKER, f_nodes); DEBUG_PRINT("Готово!\n"); } diff --git a/main.c b/main.c index 26dccad..e92a811 100644 --- a/main.c +++ b/main.c @@ -56,7 +56,6 @@ struct tred_pizdec{ struct dir_list_struct{ - struct metadata* top; struct metadata* file; struct dir_list_struct* next; }; @@ -74,7 +73,6 @@ typedef struct metadata { void dir_list_struct_init(struct dir_list_struct* dir_list_struct){ - dir_list_struct->top = NULL; dir_list_struct->file = NULL; dir_list_struct->next = NULL; } @@ -231,8 +229,8 @@ void scanning(struct metadata *mata){ DEBUG_PRINT("put_2 2 готов! \n"); put_2 = put_2->next; } - put_2->top = mata; put_2->file = SAS; + SAS->jamp = put_2; entry = readdir(dp); } closedir(dp); @@ -291,8 +289,8 @@ void json_create(cJSON *main_Array, char* name, long int volume, cJSON *content_ 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; + //if (meta_data->dir_list == NULL) + // meta_data->jamp = meta_data->dir_list; struct dir_list_struct* global_dir_list = meta_data->dir_list; while(1){ //printf("%s%s",global_dir_list->file->name ,"\n"); @@ -380,7 +378,22 @@ cJSON *print_statistik(cJSON *main_Array, struct dir_list_struct* list, char* ou return main_Array; } - +struct metadata * read_file_next(struct metadata * mata_2){ + if(mata_2->jamp->next != NULL){ + mata_2 = mata_2->jamp->next->file; + } + else{ + while(mata_2->top->jamp->next == NULL){ + printf("name XXXX: %s\n", mata_2->name); + mata_2 = mata_2->top; + if(mata_2->top->jamp == NULL)return NULL;; + printf("name XXXX2: %s\n", mata_2->name); + } + mata_2 = mata_2->top->jamp->next->file; + printf("name XXXX3: %s\n", mata_2->name); + } + return mata_2; +} void reid_dir(struct metadata * mata){ meta_data_init(mata); mata->name = opts.dir; @@ -388,14 +401,53 @@ void reid_dir(struct metadata * mata){ scanning(mata); scan_dir(mata); nanaaa(mata); + struct metadata *mata_2 = mata; + for(;mata_2 != NULL;){ + if (mata_2->tipe_dir){ + if (mata_2->dir_list != NULL){ + printf("name dir : %s\n", mata_2->name); + mata_2 = mata_2->dir_list->file; + } + else mata_2 = read_file_next(mata_2); + } + else{ + printf("size: %li\n", mata_2->size); + printf("name fule: %s\n", mata_2->name); + mata_2 = read_file_next(mata_2); + } + } } + void read_file(struct metadata * mata){ nanaaa_2(mata); + struct metadata *mata_2 = mata; + for(;mata_2 != NULL;){ + if (mata_2->tipe_dir){ + if (mata_2->dir_list != NULL){ + printf("name dir : %s\n", mata_2->name); + mata_2 = mata_2->dir_list->file; + } + else mata_2 = read_file_next(mata_2); + } + else{ + printf("size: %li\n", mata_2->size); + printf("name fule: %s\n", mata_2->name); + mata_2 = read_file_next(mata_2); + } + } + printf("AAAA0: %s\n", mata->name); printf("AAAA1: %s\n", mata->dir_list->file->name); + printf("AAAA1: %s\n", mata->dir_list->file->dir_list->file->name); + printf("AAAA1: %s\n", mata->dir_list->file->dir_list->file->dir_list->file->name); + printf("size: %li\n", mata->dir_list->file->dir_list->file->dir_list->file->size); + printf("AAAA2: %s\n", mata->dir_list->file->dir_list->file->dir_list->next->file->name); + printf("AAAA2: %s\n", mata->dir_list->file->dir_list->file->dir_list->next->next->file->name); + printf("size2: %li\n", mata->dir_list->file->dir_list->file->dir_list->next->file->size); printf("tipe_dir: %i\n", mata->dir_list->file->tipe_dir); printf("size: %li\n", mata->dir_list->file->size); + if (mata->dir_list->next == NULL) printf("SUKA\n"); else{ printf("AAAA2: %s\n", mata->dir_list->next->file->name);