#include<stdio.
h>
#include<stdlib.h>
#include<string.h>
struct File_details
{
    char file_name[10];
    int file_size;
    int file_start;
    int file_end;
}directory[100];
int   bit_vector[100];
int   memory_size;
int   free_blocks;
int   count = 0;
void initialize_bit_vector()
{
    int i;
      printf("Enter number of memory blocks : ");
      scanf("%d",&memory_size);
      for(i=0 ; i < memory_size ; i++)
      {
          bit_vector[i] = -1;
      }
      free_blocks = memory_size;
}
void show_memory_blocks()
{
    int i;
      for(i=0 ; i < memory_size ; i++)
      {
          printf("%d\t",bit_vector[i]);
      }
      printf("\nFree blocks : %d",free_blocks);
}
int find_free_block()
{
    int i;
    int block_index[memory_size];
    int block_count = 0;
    int random;
      for(i=0 ; i<memory_size ; i++)
      {
          if(bit_vector[i] == -1)
          {
              block_index[block_count++] = i;
          }
    }
    if(block_count == 0)
          return -1;
    else
    {
         random=rand() % block_count;
         return block_index[random];
    }
}
void update_bit_vector(int index , int value)
{
    bit_vector[index] = value;
}
void add_directory_entry(char *filename , int filesize ,int start_pos , int
end_pos)
{
    strcpy(directory[count].file_name , filename);
    directory[count].file_size = filesize;
    directory[count].file_start = start_pos;
    directory[count].file_end = end_pos;
    count++;
}
void create_file()
{
    char filename[10];
    int filesize;
    int start_pos , prev_pos , next_pos;
    int i;
    printf("Enter file name to create : ");
    scanf("%s",filename);
    printf("Enter file size : ");
    scanf("%d",&filesize);
    if(filesize > free_blocks)
    {
        printf("\nNo free memory !");
    }
    start_pos = find_free_block();
    if(start_pos == -1)
    {
         printf("\nNo free memory !");
    }
    else
    {
         prev_pos = start_pos;
         update_bit_vector(prev_pos , -2);
    }
    for (i = 0; i < filesize; i++)
    {
        if (i == filesize - 1)
        {
             update_bit_vector(prev_pos, -9);
        }
        else
        {
             next_pos = find_free_block();
            if (next_pos == -1)
            {
                printf("No free memory !\n");
                return;
            }
            update_bit_vector(prev_pos, next_pos);
            prev_pos = next_pos;
            update_bit_vector(prev_pos, -2);
        }
    }
    add_directory_entry(filename, filesize, start_pos, prev_pos);
    free_blocks = free_blocks - filesize;
    printf("File created: %s, Size: %d, Start: %d, End: %d\n",
           filename, filesize, start_pos, prev_pos);
}
void delete_file()
{
    char filename[10];
    int start_pos, next_pos;
    int i, j, temp;
    int file_found = 0;
    printf("Enter file name to delete: ");
    scanf("%s", filename);
    for (i = 0; i < count; i++)
    {
        if (strcmp(directory[i].file_name, filename) == 0)
        {
            file_found = 1;
            start_pos = directory[i].file_start;
            next_pos = start_pos;
            while (next_pos != -9)
            {
                temp = next_pos;
                next_pos = bit_vector[temp];
                update_bit_vector(temp, -1);
                free_blocks++;
            }
            for (j = i; j < count - 1; j++)
             {
                 directory[j] = directory[j + 1];
             }
             count--;
             printf("File deleted\n");
             break;
         }
    }
    if (!file_found) {
        printf("File not found\n");
    }
}
void display_directory()
{
    int i;
    for(i = 0 ; i < count ; i++)
    {
        printf("\nName: %s , Size : %d , Start : %d , End : %d",
directory[i].file_name ,directory[i].file_size , directory[i].file_start ,
directory[i].file_end);
    }
}
int main()
{
    int choice;
    initialize_bit_vector();
    do
    {
         printf("\n\n1. Show Memory Blocks\n");
         printf("2. Create New File\n");
         printf("3. Show Directory\n");
         printf("4. Delete File\n");
         printf("5. Exit\n");
         printf("\nEnter choice: ");
         scanf("%d", &choice);
         switch (choice)
         {
             case 1: show_memory_blocks(); break;
             case 2: create_file(); break;
             case 3: display_directory(); break;
             case 4: delete_file(); break;
             case 5: printf("You chose to Exit !"); break;
            default: printf("Invalid Choice\n");
        }
    }while(choice !=5);
}