LINUX.ORG.RU

История изменений

Исправление LINUX-ORG-RU, (текущая версия) :

Если я правильно понял то вот

  • нажми R - перезагрузить конфигурацию и применить её к программе
  • нажми T - автоматически следить за конфигурацией и при изменении файла конфигурации перезагрузить файл конфигурации и применить к программе
  • нажми Q - выход

Код говно, но суть думаю понятна.

my_config.txt лежит в том же каталоге что и программа

window_x = 550
window_y = 550
window_name = lalala

программа

#include <SDL2/SDL.h>
#include <stdio.h>
#include <sys/stat.h>

typedef struct
{
    SDL_Window *window;
    int window_x;
    int window_y;
    char * window_name;
}my_config;

my_config default_config = {NULL,500,500,"Default window name"};

void load_config(const char * filename, my_config * conf)
{
    FILE * config = fopen(filename,"r");

    fseek(config,0,SEEK_END);
    size_t filesize = ftell(config);
    fseek(config,0,SEEK_SET);

    while(ftell(config) != filesize)
    {
      char name[512];
      char vale[512];

      fscanf(config, "%64s = %64s", name, vale);

      if(strcmp(name,"window_x") == 0)
      {
         conf->window_x = atoi(vale);
      }

      if(strcmp(name,"window_y") == 0)
      {
         conf->window_y = atoi(vale);
      }

      if(strcmp(name,"window_name") == 0)
      {
         if(conf->window_name != NULL)
         {
             free(conf->window_name);
         }
         char *str = malloc(strlen(vale)+1);
         sprintf(str,"%s",vale);
         conf->window_name = str;
      }

    }


    fclose(config);

};

int check_config(const char * filename)
{
    static long long old_time = 0;
    struct stat   current_state;
    FILE * file = fopen(filename,"rb");
    if(!file)
    {
        printf("LOL\n");
    }
    int err = fstat(fileno(file), &current_state);
    
    printf("%lld %zu\n",old_time,current_state.st_mtime);
    fclose(file);
    if(current_state.st_mtime > old_time)
    {
        old_time = current_state.st_mtime;
        return 1;
    }

       return 0;
}


void update_my_game(my_config * config)
{
   SDL_SetWindowTitle(config->window,config->window_name);
   SDL_SetWindowSize(config->window,config->window_x,config->window_y);
}

int main(int argc, char* argv[])
{

    my_config config ;
    int running = 1;
    int auto_update = 0;
    int t1 = 0;
    SDL_Init(SDL_INIT_EVERYTHING);

    config.window = SDL_CreateWindow(
        default_config.window_name,
        SDL_WINDOWPOS_UNDEFINED,
        SDL_WINDOWPOS_UNDEFINED,
        default_config.window_x,
        default_config.window_y,
        SDL_WINDOW_OPENGL);


        SDL_Event event;

    while(running)
    {
        
        while(SDL_PollEvent(&event))
        {
            if(event.type == SDL_KEYDOWN)
            {
                const Uint8 *state = SDL_GetKeyboardState(NULL);

                if (state[SDL_SCANCODE_R])
                {
                    printf("Reload config & Update configuration KEK \n");
                    load_config("my_config.txt",&config);
                    update_my_game(&config);

                }

                if (state[SDL_SCANCODE_T])
                {
                    printf("ENABLED AUTO Reload config & ENABLED AUTO Update configuration LUL \n");
                    auto_update = 1;
                }

                if (state[SDL_SCANCODE_Q])
                {
                    running = 0;
                }
             }
        }

        int t2 = SDL_GetTicks();

        if(auto_update && t2 > t1)
        {

            t1 = t2 + 1000;
            int updated = check_config("my_config.txt");
            if(updated)
            {
                printf("Auto Update\n");
                load_config("my_config.txt",&config);
                update_my_game(&config);
            }
        }

    }

    if (config.window == NULL) {

        printf("Could not create window: %s\n", SDL_GetError());
        return 1;
    }
    SDL_DestroyWindow(config.window);
    SDL_Quit();
    return 0;
}
gcc main.c `pkg-config --libs sdl2` && ./a.out 

Вместо простейшего конфига что я привёл можно взять libconfig или ещё что получше или ini какой.

Исправление LINUX-ORG-RU, :

Если я правильно понял то вот

  • нажми R - перезагрузить конфигурацию и применить её к программе
  • нажми T - автоматически следить за конфигурацией и при изменении файла конфигурации перезагрузить файл конфигурации и применить к программе
  • нажми Q - выход

Код говно, но суть думаю понятна.

my_config.txt лежит в том же каталоге что и программа

window_x = 550
window_y = 550
window_name = lalala

программа

#include <SDL2/SDL.h>
#include <stdio.h>
#include <sys/stat.h>

typedef struct
{
    SDL_Window *window;
    int window_x;
    int window_y;
    char * window_name;
}my_config;

my_config default_config = {NULL,500,500,"Default window name"};

void load_config(const char * filename, my_config * conf)
{
    FILE * config = fopen(filename,"r");

    fseek(config,0,SEEK_END);
    size_t filesize = ftell(config);
    fseek(config,0,SEEK_SET);

    while(ftell(config) != filesize)
    {
      char name[512];
      char vale[512];

      fscanf(config, "%64s = %64s", name, vale);

      if(strcmp(name,"window_x") == 0)
      {
         conf->window_x = atoi(vale);
      }

      if(strcmp(name,"window_y") == 0)
      {
         conf->window_y = atoi(vale);
      }

      if(strcmp(name,"window_name") == 0)
      {
         if(conf->window_name != NULL)
         {
             free(conf->window_name);
         }
         char *str = malloc(strlen(vale)+1);
         sprintf(str,"%s",vale);
         conf->window_name = str;
      }

    }


    fclose(config);

};

int check_config(const char * filename)
{
    static long long old_time = 0;
    struct stat   current_state;
    FILE * file = fopen(filename,"rb");
    if(!file)
    {
        printf("LOL\n");
    }
    int err = fstat(fileno(file), &current_state);
    
    printf("%lld %zu\n",old_time,current_state.st_mtime);
    fclose(file);
    if(current_state.st_mtime > old_time)
    {
        old_time = current_state.st_mtime;
        return 1;
    }

       return 0;
}


void update_my_game(my_config * config)
{
   SDL_SetWindowTitle(config->window,config->window_name);
   SDL_SetWindowSize(config->window,config->window_x,config->window_y);
}

int main(int argc, char* argv[])
{

    my_config config ;
    int running = 1;
    int auto_update = 0;
    int t1 = 0;
    SDL_Init(SDL_INIT_EVERYTHING);

    config.window = SDL_CreateWindow(
        default_config.window_name,
        SDL_WINDOWPOS_UNDEFINED,
        SDL_WINDOWPOS_UNDEFINED,
        default_config.window_x,
        default_config.window_y,
        SDL_WINDOW_OPENGL);


        SDL_Event event;

    while(running)
    {
        
        while(SDL_PollEvent(&event))
        {
            if(event.type == SDL_KEYDOWN)
            {
                const Uint8 *state = SDL_GetKeyboardState(NULL);

                if (state[SDL_SCANCODE_R])
                {
                    printf("Reload config & Update configuration KEK \n");
                    load_config("my_config.txt",&config);
                    update_my_game(&config);

                }

                if (state[SDL_SCANCODE_T])
                {
                    printf("ENABLED AUTO Reload config & ENABLED AUTO Update configuration LUL \n");
                    auto_update = 1;
                }

                if (state[SDL_SCANCODE_Q])
                {
                    running = 0;
                }
             }
        }

        int t2 = SDL_GetTicks();

        if(auto_update && t2 > t1)
        {

            t1 = t2 + 1000;
            int updated = check_config("my_config.txt");
            if(updated)
            {
                printf("Auto Update\n");
                load_config("my_config.txt",&config);
                update_my_game(&config);
            }
        }

    }

    if (config.window == NULL) {

        printf("Could not create window: %s\n", SDL_GetError());
        return 1;
    }
    SDL_DestroyWindow(config.window);
    SDL_Quit();
    return 0;
}
gcc main.c `pkg-config --libs sdl2` && ./a.out 

Исходная версия LINUX-ORG-RU, :

Если я правильно понял то вот

  • нажми R - перезагрузить конфигурацию и применить её к программе
  • нажми T - автоматически следить за конфигурацией и при изменении файла конфигурации перезагрузить файл конфигурации и применить к программе
  • нажми Q - выход

Код говно, но суть думаю понятна.

my_config.txt лежит в том же каталоге что и программа

window_x = 550
window_y = 550
window_name = lalala

программа

#include <SDL2/SDL.h>
#include <stdio.h>
#include <sys/stat.h>

typedef struct
{
    SDL_Window *window;
    int window_x;
    int window_y;
    char * window_name;
}my_config;

my_config default_config = {NULL,500,500,"Default window name"};

void load_config(const char * filename, my_config * conf)
{
    FILE * config = fopen(filename,"r");

    fseek(config,0,SEEK_END);
    size_t filesize = ftell(config);
    fseek(config,0,SEEK_SET);

    while(ftell(config) != filesize)
    {
      char name[512];
      char vale[512];

      fscanf(config, "%64s = %64s", name, vale);

      if(strcmp(name,"window_x") == 0)
      {
         conf->window_x = atoi(vale);
      }

      if(strcmp(name,"window_y") == 0)
      {
         conf->window_y = atoi(vale);
      }

      if(strcmp(name,"window_name") == 0)
      {
         if(conf->window_name != NULL)
         {
             free(conf->window_name);
         }
         char *str = malloc(strlen(vale)+1);
         sprintf(str,"%s",vale);
         conf->window_name = str;
      }

    }


    fclose(config);

};

int check_config(const char * filename)
{
    static long long old_time = 0;
    struct stat   current_state;
    FILE * file = fopen(filename,"rb");
    if(!file)
    {
        printf("LOL\n");
    }
    int err = fstat(fileno(file), &current_state);
    
    printf("%lld %zu\n",old_time,current_state.st_mtime);
    fclose(file);
    if(current_state.st_mtime > old_time)
    {
        old_time = current_state.st_mtime;
        return 1;
    }

       return 0;
}


void update_my_game(my_config * config)
{
   SDL_SetWindowTitle(config->window,config->window_name);
   SDL_SetWindowSize(config->window,config->window_x,config->window_y);
}

int main(int argc, char* argv[])
{

    my_config config ;
    int running = 1;
    int auto_update = 0;
    int t1 = 0;
    SDL_Init(SDL_INIT_EVERYTHING);

    config.window = SDL_CreateWindow(
        default_config.window_name,
        SDL_WINDOWPOS_UNDEFINED,
        SDL_WINDOWPOS_UNDEFINED,
        default_config.window_x,
        default_config.window_y,
        SDL_WINDOW_OPENGL);


        SDL_Event event;

    while(running)
    {
        
        while(SDL_PollEvent(&event))
        {
            if(event.type == SDL_KEYDOWN)
            {
                const Uint8 *state = SDL_GetKeyboardState(NULL);

                if (state[SDL_SCANCODE_R])
                {
                    printf("Reload config & Update configuration KEK \n");
                    load_config("my_config.txt",&config);
                    update_my_game(&config);

                }

                if (state[SDL_SCANCODE_T])
                {
                    printf("ENABLED AUTO Reload config & ENABLED AUTO Update configuration LUL \n");
                    auto_update = 1;
                }

                if (state[SDL_SCANCODE_Q])
                {
                    running = 0;
                }
             }
        }

        int t2 = SDL_GetTicks();

        if(auto_update && t2 > t1)
        {

            t1 = t2 + 1000;
            int updated = check_config("my_config.txt");
            if(updated)
            {
                printf("Auto Update\n");
                load_config("my_config.txt",&config);
                update_my_game(&config);
            }
        }

    }

    if (config.window == NULL) {

        printf("Could not create window: %s\n", SDL_GetError());
        return 1;
    }
    SDL_DestroyWindow(config.window);
    SDL_Quit();
    return 0;
}

gcc main.c pkg-config --libs sdl2 && ./a.out